在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中使用正则表达式解析具有重复模式的字符串?的主要内容,如果未能解决你的问题,请参考以下文章

Python正则表达式

正则表达式捕获多个重复模式模式

在Python的正则表达式中使用变量[重复]

正则表达式 Python 模式 [重复]

Python网页解析器使用实例详解

第一章—正则表达式