Python正则表达式只匹配一次

我正在尝试创建一个简单的降价乳胶转换器,只是为了学习python和基本的正则表达式,但我不知道试图弄清楚为什么下面的代码不起作用:

re.sub (r'\[\*\](.*?)\[\*\]: ?(.*?)$',  r'\\footnote{\2}\1', s, flags=re.MULTILINE|re.DOTALL)

我想转换像:

s = """This is a note[*] and this is another[*]
[*]: some text
[*]: other text"""

至:

This is a note\footnote{some text} and this is another\footnote{other text}

这就是我得到的(使用上面的正则表达式):

This is a note\footnote{some text} and this is another[*]

[*]: note 2

为什么模式只匹配一次?

编辑:

我尝试了以下先行断言:

re.sub(r'\[\*\](?!:)(?=.+?\[\*\]: ?(.+?)$',r'\\footnote{\1}',flags=re.DOTALL|re.MULTILINE)
#(?!:) is to prevent [*]: to be matched

现在它匹配所有脚注,但它们没有正确匹配.

s = """This is a note[*] and this is another[*]
[*]: some text
[*]: other text"""

给了我

This is a note\footnote{some text} and this is another\footnote{some text}
[*]: note 1
[*]: note 2

有什么想法吗?

最佳答案
原因是你不能多次匹配相同的字符.匹配一个字符后,它将由正则表达式引擎使用,不能再用于其他匹配.

(通用)解决方法包括使用捕获组捕获先行断言内的重叠部分.但是在你的情况下无法完成,因为没有办法区分哪个音符与占位符相关联.

一种更简单的方法是首先在列表中提取所有注释,然后用回调替换每个占位符.例:

import re

s='''This is a note[*] and this is another[*]
[*]: note 1
[*]: note 2'''

# text and notes are separated
[text,notes] = re.split(r'((?:\r?\n\[\*\]:[^\r\n]*)+$)', s)[:-1]

# this generator gives the next replacement string 
def getnote(notes):
    for note in re.split(r'\r?\n\[\*\]: ', notes)[1:]:
        yield r'\footnote{{{}}}'.format(note)

note = getnote(notes)

res = re.sub(r'\[\*\]', lambda m: note.next(), text)
print res

转载注明原文:Python正则表达式只匹配一次 - 代码日志