我有一个特定的情况,我有一个数据框,其中在一列中我有'AZZZZ0ZZZZ'
,'ZZZZZ0ZZZZ'
,'BOMBAY 2.0'
等文字值,我想要替换中间{{ 1}}与'0'
。如果我使用简单替换命令,则其他字符串会正确替换'NA'
。
我尝试了许多不同的RegEx组合,但没有运气。
'BOMBAY 2.0'
- 导致更改df['column'].str.replace ('0','na')
BOMBAY 2.0
- 导致更改我df['column'].str.replace (r'\B0\B','na')
到'nagpur'
的其他值答案 0 :(得分:1)
在 Patrick 的回答中,假设:
0
之前存在非空序列
字母(未指定长度),0
之后,完全相同的字母序列。我怀疑你是否真的需要这个,因为你写了 只有中间0 ,但之前和之后都没有写过那些字符 应该是一样的。
如果您不需要,请注意此正则表达式不匹配
例如,例如AZZZZ0XXZZ
(ZZZZ
!= XXZZ
)。
我反过来假设,只有当0
NA
时才要将0
替换为(?<=[A-Z])0(?=[A-Z])
位于两个任意大写字母之间。
要匹配此类案例,您可以使用:
(?<=[A-Z])
说明
0
- 积极的背后隐藏 - 就在之前的char
一个大写字母。(?=[A-Z])
- 匹配的字符。0
- 积极向前看 - 之后的char也是一个
大写字母(幸运的是,Python支持两种外观)。它不匹配,例如BOMBAY 2.0
中的0
,但会与ZZZZZ0XZZZ
匹配
在例如NA
。
然后你应该用0
替换整场比赛。所以,正如这个正则表达式
不使用捕获组,它更简单。
注意:
如果你的要求是两个相邻的字符必须是字母,但是 大写或小写,然后添加不区分大小写的选项。
如果您对a
之前/之后的内容有其他要求
替换,然后相应地改变lookbehind / lookahead部分。
答案 1 :(得分:0)
只需打开任何编辑器(在我的情况下是记事本++),使用正则表达式re =([a-zA-Z] +)0([a-zA-Z] +)并替换为$ 1NA $ 2
答案 2 :(得分:0)
标志:CaseInsensitive,Newline
正则表达式:^(.*?)([a-z]+)(?:0)(?:\2)(.*?)$
说明:
^ ..... $ from begin to end
(.*?) catchall non.greedy ==> /1 and /3
/[a-z]+ any character (insensitive) ==> /2
/1 backreference to 1st match of [a-z]+
替换为:\1\2na\2\3
这将匹配
之类的内容VBNAAA0AAACC but not AAAA0BAAA
答案 3 :(得分:0)
如果您没有太多数据,可以尝试这种方法:
data1=['AZZZZ0ZZZZ', 'ZZZZZ0ZZZZ', 'BOMBAY 2.0']
def replacement(replace,with_replace):
final_list=[]
for i in data1:
data = list(i)
for index, value in enumerate(data):
if value == replace:
try:
if isinstance(data[index - 1], str) and isinstance(data[index + 1], str):
data[index] = with_replace
except IndexError:
pass
final_list.append("".join(data))
return final_list
print(replacement('0','NA'))
输出:
['AZZZZNAZZZZ', 'ZZZZZNAZZZZ', 'BOMBAY 2.0']
答案 4 :(得分:0)
正则表达式:([A-Za-z]+)0([A-Za-z]+)
def replace(text):
return re.sub(r'([A-Za-z]+)0([A-Za-z]+)', r'\1NA\2', text)
replace('AZZZZ0ZZZZ') >> AZZZZNAZZZZ
replace('ZZZZZ0ZZZZ') >> ZZZZZNAZZZZ
replace('BOMBAY 2.0') >> BOMBAY 2.0
答案 5 :(得分:0)
您可以捕获组([A-Za-z])
中的小写或大写字符,引用该组\2
并重复该次数*
以获取连续字符。
也在组(我将其命名为cc
)中捕获这些连续字符,然后匹配0,然后引用cc
然后在python中你可以使用像\g<cc>NA\g<cc>