我们假设我的字符串为"#big and #small, #big-red, #big-red-car and #big"
如何使用re.sub(), re.match(), etc.
将一个标记替换为单词?
例如,所有#big
必须更改为BIG,但#big-red
和#big-red-car
不应受到影响。
答案 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