Python:如何使用正则表达式

时间:2016-03-31 01:17:14

标签: python regex pandas replace

我的调查数据在pandas数据框中显示答案如下:

A            B           C           D           E
a. cattle    c. bird     b. cat      a. cattle   1.20-60
c. bird      b. cat      a. cattle   b. cat      3.61-103
b. cat       a. cattle   c. bird     c. bird     2.10-19

我正在尝试删除答案参考字符/数字(' a。',b。',' c。',' 1。 ,' 2。',3。')以及在实际答案之前发生的白色空间,留下看起来像这样的东西:

A         B        C        D        E
cattle    bird     cat      cattle   20-60
bird      cat      cattle   cat      61-103
cat       cattle   bird     bird     10-19

以下代码使用的是一个字典,用于说明哪个答案引用需要替换为'':

df[repval_cols].replace({
 'a. ':'',
 'b. ':'',
 'c. ':'',
 '1.':'',
 '2.':'',
 '3.':'',
  }, regex=True)

[repval_cols]是我希望发生这种情况的数据框中的列列表。

但是我遇到的问题是我从上面使用的代码会删除列中字符串中的每个字符实例,因此它会留下像这样的无意义数据:

A        B       C       D       E
cttle    ird     ct      cttle   0-60
ird      ct      cttle   ct      6-0
ct       cttle   ird     ird     0-9

有人可以解释为什么它会替换与我字典中的字符不匹配的字符吗?我明确表示要更换' a。 '与''不只是任何' a'在字符串中。

非常感谢任何建议/建议

3 个答案:

答案 0 :(得分:1)

您可以根据第一个时段将字符串拆分为两个。然后从分割对中取出第二个项目并去掉空格。

>>> (df.apply(lambda s: s.str.split('.', n=1))
       .apply(lambda s: [pair[1].strip() for pair in s])
     )
         A        B        C        D       E
0   cattle     bird      cat   cattle   20-60
1     bird      cat   cattle      cat  90-300
2      cat   cattle     bird     bird   10-19

对于正则表达式语句,您需要转义句点(点或.),这是用于匹配任何字符的正则表达式中的元字符。要匹配文字点,您需要将其转义(\.)。

>>> df.replace({
 'a\. ': '',
 'b\. ': '',
 'c\. ': '',
 '1\.': '',
 '2\.': '',
 '3\.': ''}, regex=True)
        A       B       C       D       E
0  cattle    bird     cat  cattle   20-60
1    bird     cat  cattle     cat  90-300
2     cat  cattle    bird    bird   10-19

答案 1 :(得分:0)

你不需要正则表达式进行这种转换。

将字符串拆分为.,取第二个元素和strip

def parse(mystr): 
    return mystr.split('.')[1].strip()

df[repval_cols].applymap(parse)

以下是applymap method的文档。它将提供的函数应用于数据框中的每个元素,类似于apply方法。

答案 2 :(得分:0)

  

我明确地说要取代'a。 'with''不仅仅是字符串中的任何'a'。

您的问题是.点,这是任何字符的正则​​表达式中的wildcard。 使用\.将其转义并使其成为 literal dot 可能会解决您的问题。

因此,您的代码变为。

df[repval_cols].replace({
 'a\. ':'',
 'b\. ':'',
 'c\. ':'',
 '1\.':'',
 '2\.':'',
 '3\.':'',
  }, regex=True)