在Python中使用正则表达式解析具有重复模式的字符串?
Posted
技术标签:
【中文标题】在Python中使用正则表达式解析具有重复模式的字符串?【英文标题】:Parsing string with repeating pattern with regex in Python? 【发布时间】:2019-12-07 17:51:56 【问题描述】:我用 Python 脚本逐行读取了一个文本文件。我得到的是一个字符串列表,每行一个字符串。我现在需要将每个字符串解析为更易于管理的数据(即字符串、整数)。
字符串看起来像这样:
“描述(编号)”(例如“门(0)”) “描述(数字|数字|数字)”(例如“窗口(1|22|4)) “描述 (number|number|number|number)”(例如“toilet (2|6|5|10))现在我想要的是文本文件中每一行的 拆分/解析字符串列表,我可以进一步处理,例如:
“窗口 (1|22|4)”-> [“窗口”、“1”、“22”、“4”]我想正则表达式是最适合实现这一点的,我已经设法想出了这个:
(.+)\s+((\d+)\)
,完美匹配例如 [ "door", "0" ] for "door (0)"
但是,有些项目需要解析更多数据:
(.+)\s((\d+)+\|\)
,仅匹配“window (1|22|4) 的 [ "window", "1" ]i>
我怎样才能重复模式匹配为部分(\d+)+\|
(即“1|”)直到右括号,以获得该模式的未定义次数重复?最后要匹配的项目是一个整数,可以用(\d+)\)
单独捕获。
还有没有办法用一个正则表达式匹配简单或扩展情况?
谢谢!祝大家周末愉快!
【问题讨论】:
【参考方案1】:这是正则表达式:\w+ \((\d+\|)*\d+\)
。但是imo你应该混合使用正则表达式和str.split
data = []
with open("f.txt") as f:
for line in f:
word, numbers = re.search(r"(\w+) \(([^)]+)\)", line).groups()
data.append((word, *numbers.split("|")))
print(data) # [('door', '0'), ('window', '1', '22', '4')]
【讨论】:
【参考方案2】:import re
a = [r'door (0)',
r'window (1|22|4)',
r'toilet (2|6|5|10)'
]
for i in a:
print(re.findall('(\w+)',i))
结果:
['door', '0']
['window', '1', '22', '4']
['toilet', '2', '6', '5', '10']
【讨论】:
\d
是\w
的子集。第二组永远不匹配。代码相当于for i in a: b = re.findall('(\w+)',i) print ( b )
【参考方案3】:
不是原始的正则表达式,而是另一种提取和处理数据的方法是使用TTP模板
from ttp import ttp
template = """
<macro>
def process_matches(data):
data["numbers"] = data["numbers"].split("|")
return data
</macro>
<group name=" thing " macro="process_matches">
thing ( numbers )
</group>
"""
data = """
door (0)
window (1|22|4)
toilet (2|6|5|10)
"""
parser = ttp(data, template)
parser.parse()
print(parser.result(format="pprint")[0])
上面的代码会产生
[ 'door': 'numbers': ['0'],
'toilet': 'numbers': ['2', '6', '5', '10'],
'window': 'numbers': ['1', '22', '4']]
【讨论】:
以上是关于在Python中使用正则表达式解析具有重复模式的字符串?的主要内容,如果未能解决你的问题,请参考以下文章