python:替换/替换字符串中的所有全字匹配

时间:2016-05-27 20:02:40

标签: python regex django string

我们假设我的字符串为"#big and #small, #big-red, #big-red-car and #big"

如何使用re.sub(), re.match(), etc.将一个标记替换为单词?

例如,所有#big必须更改为BIG,但#big-red#big-red-car不应受到影响。

2 个答案:

答案 0 :(得分:6)

让我们定义你的字符串:

>>> 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 "a comma or period after it"时测试这是否正常工作,让我们创建一个新字符串:

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

答案 1 :(得分:3)

此信息是一种单向边界技巧。

使用否定查看后面/前面的断言,
在特定方向内,它将使BEGIN / END字符串匹配,
但不允许其他人匹配。

这导致了一些有趣的组合方案 一个阶级内的消极构造,涵盖了无穷无尽的范围 字符,但让你排除中的一些个别字符 那个范围。

要使用的典型构造是否定类。

\D - 非数字类
\S - 非空白班级 \W - 非词类
\PP - 非标点属性类
\PL - 非字母属性类

由于它们用于否定断言,因此反向实际上是 正在寻找的人物。

分别为

\d, \s, \w, \pP, \pL

权力来自于它们可以合并在一起的事实 一个用于戏剧效果。

如果将某个字符添加到课程中,则会将其排除在外,不允许使用 实际上,它会创建类减法

创建课程时的规则是:

  • 您想要的字符,插入它是否定的(即\D\PP等等。)
  • 您不想要的个人字符,正常插入(例如\n=等。)
    这可以用作类减法。

减法示例:(?![\S\r\n])将是一个前瞻边界,需要使用 只有水平空格,在某些引擎中,表示为
\h构造。

在你的例子中,边界将是这样的。

(?<![\S\PP-])#big(?![\S\PP-])

分解

 (?<!            # 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