正则表达式匹配列表末尾元素

2024-09-28 22:30:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

Tags: 目标列表play数字doonelistthree
1条回答
网友
1楼 · 发布于 2024-09-28 22:30:14

我建议将<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)修饰符允许.匹配任何字符,包括换行符),然后匹配<!list>
  • re.sub中,传递回调repl方法,处理匹配对象
  • repl方法中,定义了包含必要替换项的字典,使用键创建一个带有替换项和两个lookbehind的正则表达式(这可以很容易地更改为捕获组,但代码会增长一点点)。在re.sub中,lambda作为替换传递,它允许我们使用匹配值来获取正确的字典值。你知道吗

相关问题 更多 >