我目前有一个类似于以下内容的字符串:
str = 'abcHello Wor=A9ld'
我想要做的是找到'abc'和'= A9'并用空字符串替换这些匹配的组,这样我的最后一个字符串就是'Hello World'。
我目前正在使用这个正则表达式,它正确地找到了我要替换的组:
r'^(abc).*?(=[A-Z0-9]+)'
我尝试使用以下代码替换这些组:
clean_str = re.sub(r'^(abc).*?(=[A-Z0-9]+)', '', str)
使用上面的代码导致:
print(clean_str)
>>> 'ld'
我的问题是,如何使用re.sub将这些组替换为空字符串并获取我的“Hello World”?
答案 0 :(得分:3)
捕获其他所有内容并将这些组放入替换中,如下所示:
re.sub(r'^abc(.*?)=[A-Z0-9]+(.*)', r'\1\2', s)
答案 1 :(得分:2)
这是一种天真的方法,但为什么你不能使用replace
两次而不是正则表达式,如下所示:
str = str.replace('abc','')
str = str.replace('=A9','')
print(str) #'Hello World'
答案 2 :(得分:2)
这对我有用。
re.sub(r'^(abc)(.*?)(=[A-Z0-9]+)(.*?)$', r"\2\4", str)
答案 3 :(得分:1)
有没有办法可以确保
abc
存在,否则不要替换第二种模式?
我知道您需要首先检查字符串是否以abc
开头,如果是,请删除字符串中的abc
和=[0-9A-Z]+
模式的所有实例。
我建议:
import re
s="abcHello wo=A9rld"
if s.startswith('abc'):
print(re.sub(r'=[A-Z0-9]+', '', s[3:]))
此处,if s.startswith('abc'):
检查字符串是否在开头有abc
,然后s[3:]
从开头删除abc
,然后re.sub
截断字符串}删除=[A-Z0-9]+
模式的所有非重叠实例。
请注意,您可以使用PyPi regex
module对一个正则表达式执行相同操作:
import regex
r = regex.compile(r'^abc|(?<=^abc.*?)=[A-Z0-9]+', regex.S)
print(r.sub('', 'abcHello Wor=A9ld=B56')) # Hello World
print(r.sub('', 'Hello Wor=A9ld')) # => Hello Wor=A9ld
在这里,
^abc
- abc
|
- 或(?<=^abc.*?)
- 检查输入开头是否有abc
,然后是当前位置左侧的换行符以外的任何数量的字符=[A-Z0-9]+
- =
后跟1个大写ASCII字母/数字。