我有这样的样本:
sample = 'TEXT/xx_271802_1A'
p = re.compile("(/[a-z]{2})")
print p.match(sample)
在xx的位置上的可以是[a-z]中的任何数量2:
TEXT/qq_271802_1A TEXT/sg_271802_1A TEXT/ut_271802_1A
我怎样才能找到这个xx和f.e.将其替换为' WW':
TEXT/WW_271802_1A TEXT/WW_271802_1A TEXT/WW_271802_1A
我的代码返回None
答案 0 :(得分:2)
您可以尝试以下正则表达式:
>>> sample = 'TEXT/xx_271802_1A'
>>> import re
>>> re.findall(r'([a-z])\1',sample)
['x']
>>> re.sub(r'([a-z])\1','WW',sample)
'TEXT/WW_271802_1A'
>>> sample = 'TEXT/WW_271802_1A TEXT/WW_271802_1A TEXT/WW_271802_1A'
>>> re.sub(r'([a-z])\1','WW',sample)
'TEXT/WW_271802_1A TEXT/WW_271802_1A TEXT/WW_271802_1A'
RegEx ([a-z])\1
搜索1个字母,如果它立即重复,则匹配它。
答案 1 :(得分:2)
sample = 'TEXT/xx_271802_1A'
p = re.compile("(/[a-z]{2})")
print p.search(sample).group()
您的代码返回None
,因为您使用的match
匹配start
。您需要search
或findall
,因为您在字符串中找到了任何位置不是一开始。
替换使用
re.sub(r'(?<=/)[a-z]{2}','WW',sample)
答案 2 :(得分:1)
你只需要这样做:
sample = re.sub(r'(?<=/)[a-z]{2}', 'WW', sample)
在匹配之前无需检查字符串。 <{1}}在找到模式时进行替换。
re.sub
是一个lookbehind断言,意味着以开头,它只是一个检查而不是匹配结果的一部分。因此(?<=..)
未被替换。
以同样的方式,如果要检查是否有下划线,可以在模式的末尾添加前瞻/
(后跟)。