Python在标签正则表达式中拆分

时间:2017-02-23 17:22:07

标签: python regex

我正在尝试拆分这些行:

<label>Olympic Games</label>
<title>Next stop</title>

分为:

["<label>", "Olympic Games", "</label>"]
["<title>", "Next stop", "</title>"]

在Python中,我可以使用正则表达式,但我所做的并没有做任何事情:

line.split("<\*>")

4 个答案:

答案 0 :(得分:4)

使用lookarounds和捕获组在拆分后保留文本:

re.split(r'(?<=>)(.+?)(?=<)', '<label>Olympic Games</label>')

答案 1 :(得分:3)

这个正则表达式对我有用:

<(label|title)>([^<]*)</(label|title)>

或者, cwallenpoole 建议:

<(label|title)>([^<]*)</(\1)>

enter image description here

我使用了http://www.regexpal.com/

我使用了三个捕获组,如果您不需要它们,只需删除()

你的正则表达式<\*>的错误是只匹配一件事:<*>。您已使用*跳过\*,所以您所说的是:

  • 将所有文字与<匹配,然后与*匹配,再与>匹配。

答案 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', '...']]