使用正则表达式仅替换某些单词

问题描述 投票:0回答:2

我的文本包含许多“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>&emsp;TEMPO", text)
new_text = re.sub("BKN009 TEMPO", "BKN009 </br>&emsp;TEMPO", text)
new_text = re.sub("BKN012 TEMPO", "BKN012 </br>&emsp;TEMPO", text)

问题是我必须检查所有的可能性。我可以在

re.sub
中使用正则表达式吗?例如,我使用了这个,但它不起作用

new_text = re.sub("BKN0\d\d", "BKN0\d\d </br>&emsp;TEMPO", text)
python regex replace
2个回答
0
投票

你可以使用

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*


-4
投票

有两种方法可以解决您的问题。 一种是简单地依次替换模式“PROB”和“TEMPO”(前面不加“PROB”):

import re

text = "PROB TEMPO BKN001 TEMPO BKN009 PROB TEMPO BKN008 TEMPO BKN012..."

new_text = re.sub(r"PROB", r"<br/>&emsp;PROB", text)
new_text = re.sub(r"(?<!PROB) TEMPO", r"<br/>&emsp;TEMPO", new_text)
print(new_text)
# <br/>&emsp;PROB TEMPO BKN001<br/>&emsp;TEMPO BKN009 <br/>&emsp;PROB TEMPO BKN008<br/>&emsp;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/>&emsp;\g<0>", text)
print(new_text)
# <br/>&emsp;PROB TEMPO BKN001<br/>&emsp; TEMPO BKN009 <br/>&emsp;PROB TEMPO BKN008<br/>&emsp; TEMPO BKN012...

要匹配的模式是“PROB”或“TEMPO”(前面不带“PROB”)。 替换字符串中的

\g<0>
是对整个匹配的反向引用。

在您的问题中,您尝试使用反向引用并以

BKN0\d\d
开始替换字符串。 意图很明显,但这只会解析为字面的退格键。 反向引用告诉正则表达式引擎“这就是之前的模式匹配的内容”。

另请注意,我使用了

<br/>
(不是
</br>
),因为这是换行符的正确 XHTML 元素。

© www.soinside.com 2019 - 2024. All rights reserved.