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

时间:2017-12-26 15:50:29

标签: python regex findall

我正在尝试使用python findall()

从以下'text'获取多个元组
φ2 = asin( sin φ1 ⋅ cos δ + cos φ1 ⋅ sin δ ⋅ cos θ )
λ2 = λ1 + atan2( sin θ ⋅ sin δ ⋅ cos φ1, cos δ − sin φ1 ⋅ sin φ2 )

我想从'text'

获得以下匹配模式
text = '[szur formatter] line 1<?xml version="1.0"?><star>[szur parser] line 2<?xml version="1.0"?><Planet>'

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

    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)

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

2 个答案:

答案 0 :(得分: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的混合,请问问自己:&#34;我是如何到达这里的?&#34;

答案 1 :(得分:0)

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

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

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

<小时/> 在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)