具有多个值的前瞻断言

时间:2017-04-07 09:55:27

标签: python regex lookahead

我有以下文字:

[red]

aaa [bbb] hello

[blue]

aaa

[green]

ccc

我想提取节标题之间的所有文本。我尝试了从特定节标题匹配的前瞻断言,直到标题列表中的另一个标题:

keys = ('red', 'blue', 'green')
for key in keys:
    match = re.search(r'\[' + key + r'\](.*)(?=(?:' + '|'.join(keys) + r'|$))',
                      text, flags=re.DOTALL)

    print(key, match.group(1))

我遗失了一些东西,因为它与任何东西都不匹配。有什么想法吗?

4 个答案:

答案 0 :(得分:0)

你可以正则表达式!您可以将部分及其中的值组合在一起,例如

>>> import re
>>> print re.findall(r'\[(\w*)\]([\w \n]*)',text)
[('red', '\n\naaa '), ('bbb', ' hello\n\n'), ('blue', '\n\naaa\n\n'), ('green', '')]

此处为您的部分\[(\w*)\]([\w \n]*)部分提供了相关内容。有了这个结果,您可以剥离或替换多余的换行符!

希望它有所帮助!

答案 1 :(得分:0)

也许这种方法可以起作用:

variant.registerResGeneratingTask

结果:

keys = ('red', 'blue', 'green')

res = re.findall(r'\[\w+\].?|([\w\[\] ]+)', text)
res = [x for x in res if x]

for n in range(len(keys)):
    print(keys[n], res[n])

示例

https://regex101.com/r/p55ckh/1

答案 2 :(得分:0)

最后,我决定不使用正则表达式来匹配部分内容

# Walk through the file line by line and collect text from the specific sections
keys = ('red', 'blue', 'green')
last_section = ''
for line in text.splitlines():
    if line.startswith('#'):
        continue

    match = re.match(r'^\[(' + '|'.join(keys) + ')\]', line)
    if match:
        last_section = match.group(1)
        continue

    if last_section:
        new_contents[last_section] += '\n' + line

for section in new_contents:
    new_contents[section] = new_contents[section].strip()

答案 3 :(得分:0)

字符串处理方法,无论文本中键的顺序如何。如果你不想使用正则表达式,希望它有所帮助!

xaxt = "n"