我有一个文件,其中包含两种不同类型的数据,我想用正则表达式进行解析;但是,数据足够相似,我找不到区分它的正确方法。
我文件中的某些行格式为:
AED=FRI
AFN=FRI:SAT
AMD=SUN:SAT
其他行的形式
AED=20180823
AMD=20150914
AMD=20150921
其余的行是标题,我想丢弃它们。例如
[HEADER: BUSINESS DATE=20160831]
到目前为止我的解决方案是匹配前三个大写字母和一个等号,
r'\b[A-Z]{3}=\b'
但之后我不确定如何区分日期(例如20180823)和日期(例如FRI:SAT:SUN)。
我期望从这些解析函数得到的结果:
Regex weekday_rx = new Regex(<EXPRESSION FOR TYPES LIKE AED=FRI>);
Regex date_rx = new Regex(<EXPRESSION FOR TYPES LIKE AED=20160816>);
weekdays = [weekday_rx.Match(line) for line in infile.read()]
dates = [date_rx.Match(line) for line in infile.read()]
答案 0 :(得分:2)
r'\S*\d$'
将匹配以数字结尾的所有非空白字符
将匹配AED=20180823
r'\S*[a-zA-Z]$'
匹配以字母结尾的所有非空白字符。
将匹配AED=AED=FRI
AFN=FRI:SAT
AMD=SUN:SAT
两者都不匹配
[HEADER: BUSINESS DATE=20160831]
这将匹配
r'(\S*[a-zA-Z]$|\S*\d$)'
将*替换为您期望的出现次数会更安全,(a|b)
匹配a或匹配b
答案 1 :(得分:2)
以下是Python中的解决方案:)
import re
p = re.compile(r'\b([A-Z]{3})=((\d)+|([A-Z])+)')
str_test_01 = "AMD=SUN:SAT"
m = p.search(str_test_01)
print (m.group(1))
print (m.group(2))
str_test_02 = "AMD=20150921"
m = p.search(str_test_02)
print (m.group(1))
print (m.group(2))
"""
<Output>
AMD
SUN
AMD
20150921
"""
答案 2 :(得分:2)
使用管道表达正则表达式中的替代方案。模式&#39; [A-Z] {3}:[A-Z] {3} | [A-Z] {3}&#39;将匹配ABC和ABC:ABC。然后使用括号对结果进行分组:
import re
match = re.match(r'([A-Z]{3}:[A-Z]{3})|([A-Z]{3})', 'ABC:ABC')
assert match.groups() == ('ABC:ABC', None)
match = re.match(r'([A-Z]{3}:[A-Z]{3})|([A-Z]{3})', 'ABC')
assert match.groups() == (None, 'ABC')
您可以研究命名组的概念,使其更具可读性。另外,请查看匹配对象的文档以获取有用的信息和方法。