Python re.sub仅改变单词'a'而不是'a'的每个实例作为字母

时间:2014-01-18 07:17:29

标签: python regex string

例如,假设我想在下面的文字中将每个单词'a'更改为'an':

"a apple is a| awesome fruit."

假设“|”字符作为垃圾字符需要解决。 我希望最终产品如下:

"an apple is an| awesome fruit."

到目前为止,我得到的最接近的是以下代码:

>>> s = 'a apple is a| awesome fruit.'
>>> regex = '[^A-Za-z0-9](a)[^A-Za-z0-9]'
>>> s = re.sub(regex, 'an', s)
>>> s
'a apple isan awesome fruit.'

'a'显示在字符串的开头根本没有受到影响,而'a'后续的垃圾会破坏该区域中的字符串。我理解为什么会这样发生,我只是不知道如何使正则表达式模式适应这种情况。我的计划是只改变子串组(a),但我不知道如何在re.sub中使用它。我怎样才能替换子串组?在这种情况下,有没有更好的方法来使用正则表达式?

2 个答案:

答案 0 :(得分:4)

您可以使用字词边界(\b\w班级和\W班级(或\w^或{{}之间匹配1}}和\w):

$

答案 1 :(得分:1)

对于单词边界,

\b在这里是一个很好的答案,更通用的结构称为“lookahead”和“lookbehind”。这看起来像是:

re.sub(r'\ba\b', 'an', s)

re.sub(r'((?<=\W)|^)a((?=\W)|$)', 'an', s)