如何从字符串

时间:2018-02-03 13:38:35

标签: python regex python-3.x dataframe

我有一个特定的情况,我有一个数据框,其中在一列中我有'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'的其他值

6 个答案:

答案 0 :(得分:1)

Patrick 的回答中,假设:

  • 在匹配0之前存在非空序列 字母(未指定长度),
  • 在此0之后,完全相同的字母序列。

我怀疑你是否真的需要这个,因为你写了 只有中间0 ,但之前和之后都没有写过那些字符 应该是一样的。

如果您不需要,请注意此正则表达式不匹配 例如,例如AZZZZ0XXZZZZZZ!= 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替换整场比赛。所以,正如这个正则表达式 不使用捕获组,它更简单。

注意:

  1. 如果你的要求是两个相邻的字符必须是字母,但是 大写或小写,然后添加不区分大小写的选项。

  2. 如果您对a之前/之后的内容有其他要求 替换,然后相应地改变lookbehind / lookahead部分。

答案 1 :(得分:0)

只需打开任何编辑器(在我的情况下是记事本++),使用正则表达式re =([a-zA-Z] +)0([a-zA-Z] +)并替换为$ 1NA $ 2

答案 2 :(得分:0)

https://regexr.com/3k753

标志: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

(?P<cc>([A-Za-z])\2*)0(?P=cc)

然后在python中你可以使用像\g<cc>NA\g<cc>

这样的替换

Example output python