Python正则表达式类似的表达式

时间:2016-09-01 13:31:31

标签: python regex

我有一个文件,其中包含两种不同类型的数据,我想用正则表达式进行解析;但是,数据足够相似,我找不到区分它的正确方法。

我文件中的某些行格式为:

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()]

3 个答案:

答案 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')

您可以研究命名组的概念,使其更具可读性。另外,请查看匹配对象的文档以获取有用的信息和方法。