首页 > 解决方案 > 在 python 中的正则表达式匹配前添加分隔符

问题描述

我在这里有以下文本块,并想在子句编号前添加一个分隔符(4.1 ... 4.2 ...,等等)

4.1 Use unique passwords (Manual)
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent eu velit a libero convallis hendrerit. Nulla interdum fermentum viverra. Maecenas tincidunt sollicitudin odio. Aenean a erat sagittis, lacinia nulla eu, ornare velit. Suspendisse tempor at nisi eu mattis. Phasellus in ante magna. Quisque nisl lacus, fermentum pulvinar odio id, auctor sagittis nisl. Proin bibendum cursus orci vitae finibus.

4.2 Set password lifetime (Automated)
Quisque ut vehicula diam. Maecenas ac nulla cursus, dictum odio ac, lobortis dui. Nullam euismod, enim sed mollis elementum, tellus urna porttitor augue, ac venenatis tortor diam eget leo. In euismod dapibus tortor et vehicula. Aliquam erat volutpat. Quisque id rutrum libero. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam sollicitudin pellentesque magna sit amet malesuada. Aenean pulvinar metus sed justo tincidunt, et fermentum sem gravida. Aliquam varius lacus sit amet aliquam elementum. Pellentesque a varius magna, at euismod ligula. Praesent odio nunc, faucibus vel urna non, varius porta velit.

这样文本中的每个子句都会出现“分隔符”:

'delimiter' 4.3 Set password expiry warning (Automated)
Quisque ut vehicula diam. Maecenas ac nulla cursus, dictum odio ac, lobortis dui. Nullam euismod, enim sed mollis elementum, tellus urna porttitor augue, ac venenatis tortor diam eget leo. In euismod dapibus tortor et vehicula. Aliquam erat volutpat. Quisque id rutrum libero. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. 

我正在使用 re.sub 执行匹配和替换,但我不太确定如何不完全删除子句编号:

result = re.sub(r'[0-9\.]{3,}\s*[A-Z][\d\w\s/\-\,\(\)\\\"]{1,}\s*\(Automated|Manual\)', 'delimiter', text)

任何帮助,将不胜感激!

标签: python-3.xregex

解决方案


你可能会使用

^\d+(?:\.\d+)? .*\((?:Manual|Automated)\)
  • ^字符串的开始
  • \d+(?:\.\d+)?将 1+ 位数字与可选的小数部分匹配
  • .*\((?:Manual|Automated)\)匹配字符串中的一个空格(Manual)(Automated)

正则表达式演示

在替换中,使用分隔符后跟完整匹配

delimiter \g<0>

例如

import re

regex = r"^\d+(?:\.\d+)? .*\((?:Manual|Automated)\)"

s = ("4.1 Use unique passwords (Manual)\n"
    "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent eu velit a libero convallis hendrerit. Nulla interdum fermentum viverra. Maecenas tincidunt sollicitudin odio. Aenean a erat sagittis, lacinia nulla eu, ornare velit. Suspendisse tempor at nisi eu mattis. Phasellus in ante magna. Quisque nisl lacus, fermentum pulvinar odio id, auctor sagittis nisl. Proin bibendum cursus orci vitae finibus.")

result = re.sub(regex, r"delimiter \g<0>", s, 0, re.MULTILINE)

if result:
    print (result)

输出

分隔符 4.1 使用唯一密码(手动) Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent eu velit a libero convallis hendrerit。Nulla interdum infantum viverra。Maecenas tincidunt sollicitudin odio。Aenean a erat sagittis, lacinia nulla eu, ornare velit。nisi eu mattis 的 Suspendisse tempor。大前锋中的Phasellus。Quisque nisl lacus, pulvinar odio id, auctor sagittis nisl。Proin bibendum cursus orci vitae finibus。


推荐阅读