使用Pandas使用正则表达式替换字符串

时间:2018-04-25 10:56:58

标签: regex python-3.x pandas replace

在Pandas中,为什么以下内容不会替换任何包含感叹号的字符串及其后面的内容?

In [1]: import pandas as pd

In [2]: ser = pd.Series(['Aland Islands !Åland Islands', 'Reunion !Réunion', 'Zi
   ...: mbabwe'])

In [3]: ser
Out[3]: 
0    Aland Islands !Åland Islands
1                Reunion !Réunion
2                        Zimbabwe
dtype: object

In [4]: patt = r'.*!(.*)'

In [5]: repl = lambda m: m.group(1)

In [6]: ser.replace(patt, repl)
Out[6]: 
0    Aland Islands !Åland Islands
1                Reunion !Réunion
2                        Zimbabwe
dtype: object

尽管对匹配的子字符串的直接引用确实有效:

In [7]: ser.replace({patt: r'\1'}, regex=True)
Out[7]: 
0    Åland Islands
1          Réunion
2         Zimbabwe
dtype: object

在第一种情况下我做错了什么?

3 个答案:

答案 0 :(得分:0)

试试这个:

pattern = r'(。*)!'

ser.replace(pattern,'',regex = True)

在您的情况下,您没有设置regex = True,因为默认情况下它是假的。

答案 1 :(得分:0)

replace似乎不支持将方法作为替换参数。因此,您所能做的就是隐式导入re库并使用apply

>>> import re
>>> #... your code ...
>>> ser.apply(lambda row: re.sub(patt, repl, row))
0    Åland Islands
1          Réunion
2        Zimbabwe"
dtype: object

答案 2 :(得分:0)

Pandas中有两种get()方法。

直接作用于Series的那个可以采用正则表达式模式字符串或编译的正则表达式并且可以就地执行,但不允许替换参数是可调用的。您必须设置fun get(): T { if (!isSet) { throw Error("Value not set") } @Suppress("unchecked_cast") return value as T } 并使用原始字符串。

使用:

replace

是:

regex=True

没有

import re
import pandas as pd
ser = pd.Series(['Aland Islands !Åland Islands', 'Reunion !Réunion', 'Zimbabwe'])

还有另一个,用作ser.replace(r'.*!(.*)', r'\1', regex=True, inplace=True) ser.replace(r'.*!', '', regex=True, inplace=True) regex = re.compile(r'.*!(.*)', inplace=True) ser.replace(regex, r'\1', regex=True, inplace=True) 。这个接受一个可调用的替换,但不会就地替换而不采用repl = lambda m: m.group(1) ser.replace(regex, repl, regex=True, inplace=True) 参数(尽管可以使用正则表达式模式字符串):

是:

Series.str.replace

没有

regex

我希望这对那里的人有帮助。