我正在尝试使用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>')]
如何获得预期的结果。我的正则表达式不会产生第二个元组。我如何修改我的正则表达式以获得此功能?任何指针将不胜感激。
这是一个做出一些假设的正则表达式:
>>> 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的混合,请问自己:“我是怎么来到这里的?”
我想知道这是不是一个好主意(使用正则表达式),但是你走了:
\[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)