正则表达式匹配列表元素的结尾

时间:2017-01-09 09:23:32

标签: python regex

我的目标是用相应的数字项目符号替换列表标记中的所有单词数字。例如,使用以下输入:

<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)

1 个答案:

答案 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作为替换传递,它允许我们使用匹配值来获取正确的字典值。