如何使用python findall获取多个元组

问题描述 投票:-4回答:2

我正在尝试使用python findall()从以下'text'获取多个元组

text = '[szur formatter] line 1<?xml version="1.0"?><star>[szur parser] line 2<?xml version="1.0"?><Planet>'

我希望从'text'中获得以下匹配模式

    Match 1
    [szur formatter] line 1 
    <?xml version="1.0"?><star>

    Match 2
    [szur parser] line 2
    <?xml version="1.0"?><Planet> 

我正在尝试使用此正则表达式查找

re.findall(r'\[(szur.*?[^<])(<.*>+)', text)

这收益率

[('szur formatter] line 1', '<?xml version="1.0"?><star>[szur parser] line 2<?xml version="1.0"?><Planet>')]

如何获得预期的结果。我的正则表达式不会产生第二个元组。我如何修改我的正则表达式以获得此功能?任何指针将不胜感激。

python regex findall
2个回答
0
投票

这是一个做出一些假设的正则表达式:

>>> re.findall(r"(\[szur.*?[^\]]\] line \d*)([^\[]*)", text)
[('[szur formatter] line 1', '<?xml version="1.0"?><star>'), 
 ('[szur parser] line 2',    '<?xml version="1.0"?><Planet>')]

但是,严肃地说,如果你发现自己正在使用正则表达式解析XML和非XML的混合,请问自己:“我是怎么来到这里的?”


0
投票

我想知道这是不是一个好主意(使用正则表达式),但是你走了:

\[szur[^][]*\].*?<\w+>

使用DOTALL修饰符并查看a demo on regex101.com


In Python:
import re

string = """[szur formatter] line 1<?xml version="1.0"?><star>[szur parser] line 2<?xml version="1.0"?><Planet>"""

rx = re.compile(r'(\[szur[^][]*\].*?<\w+>)')

matches = rx.findall(string)
# matches = rx.findall(string, re.DOTALL)
print(matches)
© www.soinside.com 2019 - 2024. All rights reserved.