将第一个和第三个匹配项替换为另一个字符python regex

时间:2019-07-06 09:50:22

标签: python regex

我今天正在研究正则表达式,想替换下面的模式

所以我想要的是

gere  should be gara 

cateral    should remain cateral  

为此,我使用re module使用以下正则表达式。

stg = "my string is here "
re.sub(r'e?e','a',stg)

上述表达式的问题在于它可以与gere一起正常工作,并将结果提供给gara

但是cateral也随着cataral改变

我只希望将e(任何单个字符)e替换为a(任何单个字符)a

请让我知道我在做什么错。

谢谢

2 个答案:

答案 0 :(得分:0)

e?e正则表达式先匹配可选的e,然后匹配e,因此您的re.sub(r'e?e','a',stg)命令将替换每次出现的eeea。例如。 geese会变成gaseget会变成gat

您可以使用以下之一:

re.sub(r'e(.)e', r'a\1a', stg)         # . - any char but line break char
re.sub(r'e([a-z])e', r'a\1a', stg)     # [a-z] - any lowercase ASCII letter
re.sub(r'e([^\W\d_])e', r'a\1a', stg)  # [^\W\d_] - any Unicode letter

请参见Python demo online

正则表达式详细信息:

  • e-匹配e
  • (.)-捕获除第1组换行符以外的任何字符
  • e-和e
  • 替换模式中的
  • \1插入与组1内存缓冲区中存储的相同的值。

请参见regex demo online

答案 1 :(得分:0)

我同意@wiktor-stribiżew的回答,但提出了一个可行的例子。我还从this Google教程页面的底部开始做了笔记。

基本上,我们要替换中间可能带有字母的非连续'e'值(对我来说,空格表示一个单独的单词,并且不匹配该模式)。

我试图弄清楚如何分组并以类似'(e)\ w +?(e)'的开头,但发现相反的情况是正确的。我们要“捕获”并保留两个e之间的所有内容,同时用a代替e。

无论如何,这是我的解决方案:

import re

sstr = """
gere  should be gara 

cateral    should remain cateral 
"""

### Our pattern captures and preserves whatever is in between the e's
### Note that \w+? is non-greedy and looks for at least one word character between the e's.
regex = r'e(\w+?)e'

### We then sub out the e's and replace the middle with out capture group, which is group(1).
### Like \w, the backslash escapes the 1 for group-referencing purposes.
### If you had two groups, you could retain the second one with \2, and so on.
new_str = re.sub(regex, r'a\1a', sstr)

### Output answer to the terminal.
print(new_str)

输出:

gara  should be gara 

cateral    should remain cateral