Python regex类似表达式

2024-09-21 05:48:05 发布

您现在位置: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)和天数(如星期五:星期六:太阳)。你知道吗

我希望这些解析函数的结果是:

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

Tags: 文件数据newforlinerxsatregex
3条回答

以下是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
"""
r'\S*\d$' 

将匹配以数字结尾的所有非空白字符

将匹配AED=20180823

r'\S*[a-zA-Z]$'

匹配以字母结尾的所有非空白字符。你知道吗

将匹配AED=AED=FRIAFN=FRI:SATAMD=SUN:SAT

两者都不匹配

[HEADER: BUSINESS DATE=20160831]

这两者都匹配

r'(\S*[a-zA-Z]$|\S*\d$)'

用您期望的出现次数替换*会更安全,(a|b)是match a或match b

使用管道在regex中表示替代项。模式'[A-Z]{3}:[A-Z]{3}|[A-Z]{3}'将同时匹配ABC和ABCABC: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')

您可以研究命名组的概念,使其更具可读性。此外,还可以查看match对象的文档以获得有用的信息和方法。你知道吗

相关问题 更多 >

    热门问题