我的文本包含许多“PROB TEMPO”和“TEMPO”单词,并且当 PROB 没有出现在 TEMPO 之前时,我想在单词“PROB”之前或单词“TEMPO”之前插入换行符。 我正在使用 Python 与
re.sub
例如,
text = "PROB TEMPO BKN001 TEMPO BKN009 PROB TEMPO BKN008 TEMPO BKN012..."
new_text = re.sub("PROB TEMPO", "PROB </br> TEMPO", text)
new_text = re.sub("BKN009 TEMPO", "BKN009 </br> TEMPO", text)
new_text = re.sub("BKN012 TEMPO", "BKN012 </br> TEMPO", text)
问题是我必须检查所有的可能性。我可以在
re.sub
中使用正则表达式吗?例如,我使用了这个,但它不起作用
new_text = re.sub("BKN0\d\d", "BKN0\d\d </br> TEMPO", text)
你可以使用
import re
text = "PROB TEMPO BKN001 TEMPO BKN009 PROB TEMPO BKN008 TEMPO BKN012..."
print( re.sub(r"\b(?!^)(PROB\s+TEMPO|(?<!PROB\s)TEMPO)\b\s*", "\n\\g<0>", text) )
请参阅 Python 演示。输出:
PROB TEMPO BKN001
TEMPO BKN009
PROB TEMPO BKN008
TEMPO BKN012...
\b(?!^)(PROB\s+TEMPO|(?<!PROB\s)TEMPO)\b\s*
正则表达式匹配任何PROB TEMPO
或TEMPO
(前面没有紧接着PROB
和空格)整个单词。
如果您需要在
TEMPO
之前支持多个空格,则需要安装 PyPi 正则表达式模块,然后 import regex as re
并使用 \b(?!^)(PROB\s+TEMPO|(?<!PROB\s+)TEMPO)\b\s*
。
有两种方法可以解决您的问题。 一种是简单地依次替换模式“PROB”和“TEMPO”(前面不加“PROB”):
import re
text = "PROB TEMPO BKN001 TEMPO BKN009 PROB TEMPO BKN008 TEMPO BKN012..."
new_text = re.sub(r"PROB", r"<br/> PROB", text)
new_text = re.sub(r"(?<!PROB) TEMPO", r"<br/> TEMPO", new_text)
print(new_text)
# <br/> PROB TEMPO BKN001<br/> TEMPO BKN009 <br/> PROB TEMPO BKN008<br/> TEMPO BKN012...
(?<!PROB)
部分是负向后看,如文档中所述,并且将匹配前面没有“PROB”的内容。
另一个解决方案使用了另外两个正则表达式工具:or运算符和backreferences,从正则表达式的角度来看更优雅一些。
import re
text = "PROB TEMPO BKN001 TEMPO BKN009 PROB TEMPO BKN008 TEMPO BKN012..."
new_text = re.sub(r"PROB|(?<!PROB) TEMPO", r"<br/> \g<0>", text)
print(new_text)
# <br/> PROB TEMPO BKN001<br/>  TEMPO BKN009 <br/> PROB TEMPO BKN008<br/>  TEMPO BKN012...
要匹配的模式是“PROB”或“TEMPO”(前面不带“PROB”)。 替换字符串中的
\g<0>
是对整个匹配的反向引用。
在您的问题中,您尝试使用反向引用并以
BKN0\d\d
开始替换字符串。
意图很明显,但这只会解析为字面的退格键。
反向引用告诉正则表达式引擎“这就是之前的模式匹配的内容”。
另请注意,我使用了
<br/>
(不是 </br>
),因为这是换行符的正确 XHTML 元素。