我今天正在研究正则表达式,想替换下面的模式
所以我想要的是
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
请让我知道我在做什么错。
谢谢
答案 0 :(得分:0)
e?e
正则表达式先匹配可选的e
,然后匹配e
,因此您的re.sub(r'e?e','a',stg)
命令将替换每次出现的ee
或e
与a
。例如。 geese
会变成gase
,get
会变成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
正则表达式详细信息:
e
-匹配e
(.)
-捕获除第1组换行符以外的任何字符e
-和e
\1
插入与组1内存缓冲区中存储的相同的值。答案 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