我的目标是用相应的数字项目符号替换列表标记中的所有单词数字。例如,使用以下输入:
<list>one goto school two do play three comeback <!list>
我想要以下输出,但匹配应该在列表的末尾停止:
<list>xx. goto school
|NEWLIN xx. do play
|NEWLIN xx. comeback
<!list>
regular expression suggested in the answer(也在下面复制)解决了它,但没有在列表末尾停止匹配。
((?<=\<list\>)|(?<=\|NEWLIN ))(one|two|three|four|five|six|seven|eight|nine)
答案 0 :(得分:2)
我建议将<list>
和<!list>
之间的块与(?s)<list>.*?<!list>
进行匹配,然后在这些特定位置替换您需要的内容。
以下是可以进一步改进的示例解决方案:
import re
s = "<list>one goto school\n|NEWLIN two do play\n|NEWLIN three comeback\n <!list>"
def repl(m):
l = {'one':'1', 'two':'2', 'three':'3', 'four':'4', 'five':'5', 'six':'6', 'seven':'7', 'eight':'8', 'nine':'9'}
k = r"|".join([key for key, value in l.iteritems()])
return re.sub(r"(?:(?<=<list>)|(?<=\|NEWLIN ))(?:{})".format(k), lambda x: "{}.".format(l[x.group()]), m.group())
res = re.sub(r"(?s)<list>.*?<!list>", repl, s)
print(res)
请参阅Python demo
<强>详情:
(?s)<list>.*?<!list>
正则表达式匹配<list>
,然后任何0+字符(作为(?s)
修饰符让.
匹配任何字符串换行符)然后{{1 }} <!list>
中,传递回调re.sub
方法,处理匹配对象repl
方法中,定义了具有必要替换的字典,这些键用于创建具有替换和两个lookbehinds的正则表达式(这可以很容易地转换为捕获组,但代码将变得很小有点长)。在repl
中,lambda作为替换传递,它允许我们使用匹配值来获取正确的字典值。