我正在尝试拆分这些行:
<label>Olympic Games</label>
<title>Next stop</title>
分为:
["<label>", "Olympic Games", "</label>"]
["<title>", "Next stop", "</title>"]
在Python中,我可以使用正则表达式,但我所做的并没有做任何事情:
line.split("<\*>")
答案 0 :(得分:4)
使用lookarounds和捕获组在拆分后保留文本:
re.split(r'(?<=>)(.+?)(?=<)', '<label>Olympic Games</label>')
答案 1 :(得分:3)
这个正则表达式对我有用:
<(label|title)>([^<]*)</(label|title)>
或者, cwallenpoole 建议:
<(label|title)>([^<]*)</(\1)>
我使用了三个捕获组,如果您不需要它们,只需删除()
你的正则表达式<\*>
的错误是只匹配一件事:<*>
。您已使用*
跳过\*
,所以您所说的是:
<
匹配,然后与*
匹配,再与>
匹配。 答案 2 :(得分:2)
数据:
line = """<label>Olympic Games</label>
<title>Next stop</title>"""
使用re.findall
:
import re
pattern = re.compile("(<.*(?<=>))(.*)((?=</)[^>]*>)")
print re.findall(pattern, line)
# [('<label>', 'Olympic Games', '</label>'), ('<title>', 'Next stop', '</title>')]
没有前瞻/后瞻断言,只需使用re.findall
捕获群组:
pattern = re.compile("(<[^>]*>)(.*)(</[^>]*>)")
print re.findall(pattern, line)
# [('<label>', 'Olympic Games', '</label>'), ('<title>', 'Next stop', '</title>')]
答案 3 :(得分:0)
如果您不介意标点符号,则可以使用itertools.groupby
进行快速非正则表达式替换。
<强>代码强>
import itertools as it
def split_at(iterable, pred, keep_delimter=False):
"""Return an iterable split by a delimiter."""
if keep_delimter:
return [list(g) for k, g in it.groupby(iterable, pred)]
return [list(g) for k, g in it.groupby(iterable, pred) if k]
<强>演示强>
>>> words = "Lorem ipsum ..., consectetur ... elit, sed do eiusmod ...".split(" ")
>>> pred = lambda x: "elit" in x
>>> split_at(words, pred, True)
[['Lorem', 'ipsum', '...,', 'consectetur', '...'],
['elit,'],
['sed', 'do', 'eiusmod', '...']]
>>> words = "Lorem ipsum ..., consectetur ... elit, sed do eiusmod ...".split(" ")
>>> pred = lambda x: "consect" in x
>>> split_at(words, pred, True)
[['Lorem', 'ipsum', '...,'],
['consectetur'],
['...', 'elit,', 'sed', 'do', 'eiusmod', '...']]