Python:替换/替代字符串中所有的完整单词匹配

5
假设我的字符串是"#big and #small, #big-red, #big-red-car and #big",我该如何使用re.sub()、re.match()等函数替换其中一个标签?例如,所有的#big都必须更改为BIG,但#big-red#big-red-car不应受影响。

你不需要使用正则表达式来完成这个任务。 - Vedang Mehta
只需使用 strreplace 方法即可。 - Vedang Mehta
我更新了我的问题中的字符串。@Keatinge的建议行不通,因为它会将“#big-red”替换为“BIG-red”,这是不可取的。 - Vicky Leong
1
@Keatinge,我尝试了空格的方法,但如果#big在字符串末尾,或者在其后有逗号或句号,这种方法不会起作用,对吧? - Vicky Leong
2个回答

10

让我们定义你的字符串:

>>> s = "#big and #small, #big-red, #big-red-car and #big"

现在,让我们进行替换:
>>> import re
>>> re.sub(r'#big([.,\s]|$)', r'#BIG\1', s)
'#BIG and #small, #big-red, #big-red-car and #BIG'

正则表达式 #big([.,\s]|$) 将匹配所有后面跟着句号、逗号、空格或行尾的 #big 字符串。如果您认为其他字符在 #big 之后也是可接受的,您应该将它们添加到正则表达式中。

替代方案

如果我们想要更加高级一些,我们可以使用前瞻断言 (?=...) 来确保跟随 #big 的内容是可接受的:

>>> re.sub(r'#big(?=[.,\s]|$)', r'#BIG', s)
'#BIG and #small, #big-red, #big-red-car and #BIG'

使用句号和逗号的测试

为了测试当#big后面有"逗号或句号"时,此方法是否按预期工作,让我们创建一个新字符串:

>>> s = "#big and #big, #big. #small, #big-red, #big-red-car and #big"

而且,让我们来测试一下:

>>> re.sub(r'#big(?=[.,\s]|$)', r'#BIG', s)
'#BIG and #BIG, #BIG. #small, #big-red, #big-red-car and #BIG'

4
这些信息是单向边界技巧的一类。使用否定式前/后视断言,在特定方向上,它将允许字符串的BEGIN/END匹配,但不允许其他匹配。这导致了一些有趣的场景,其中负构造在类中组合,覆盖了无限范围的字符,但让您排除该范围内的某些个别字符。通常要使用的结构是否定类。它们用于否定断言,因此反义词实际上就是寻找的字符。它们可以在类中组合以产生戏剧性的效果。如果将单个字符添加到类中,则会被排除,不允许出现。有效地创建了一个类的减法。创建类时的规则如下:1. 您想要的字符类,插入它的负数(即\D、\PP等);2. 不想要的单个字符,按正常方法插入(即\n、=等)。这可用作类的减法。减法示例:(?! [\S\r\n])将是一个前瞻性的边界,要求仅水平的空格,在某些引擎中表示为\h构造。在您的示例中,边界将像这样:(?
 (?<!            # Boundary - Behind direction
      [\S\PP-]   # Need all whitespace and punctuation, but not the '-'
 )
 \#big
 (?!             # Boundary - Ahead direction
      [\S\PP-]   # Need all whitespace and punctuation, but not the '-'
 )

每个添加到类中的字面字符实际上都会将其排除在匹配之外。

这被称为类减法。


测试用例

输入 #big and #small, #big, #big, #big-red, #big-red-car and #big

输出

 **  Grp 0 -  ( pos 0 , len 4 ) 
#big  

 **  Grp 0 -  ( pos 17 , len 4 ) 
#big  

 **  Grp 0 -  ( pos 23 , len 4 ) 
#big  

 **  Grp 0 -  ( pos 56 , len 4 ) 
#big  

基本上,只匹配这些:#big和#small,#big#big,#big-red,#big-red-car和#big


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接