【问题标题】:Replacing a substring in a string that is in between (') in Python 3.6在 Python 3.6 中替换介于 (') 之间的字符串中的子字符串
【发布时间】:2017-08-21 20:40:21
【问题描述】:

在数据框中有一列是一系列消息。每个字符串都有需要替换的不同长度的“字符”块。它看起来像这样:

Index  Message    
0      The value '0000' is not valid.
1      The value 'GA1234' for <category> must be changed.
2      The value '.30' is not a valid entry.
3      The value 'Invitation for Party' is not valid.
4      On line '0010', the value 'CARD' is invalid.

不确定如何替换 (') 之间的系列中的所有字符串。

试过:df.Message.str.replace("The value '%'", 'The value XXXXX') 但没有运气。

试过:df.Message.str.find(" ' ") 它给了我第一个撇号的位置,但不确定如何找到第二个撇号。

有没有办法可以将两者之间的子字符串 (') 替换为 'XXXXX'?

【问题讨论】:

  • 这就是regular expressions 的用途。
  • 特别是如果有转义字符的可能性,那么是的,RegEx。比如'That\'s a test'等值如何处理
  • 以前从未使用过正则表达式。看到几个以“import re”开头的例子,但还没弄明白。

标签: string python-3.x pandas replace


【解决方案1】:

Series.str.replace() 接受正则表达式:

In [184]: df
Out[184]:
   Index                                            Message
0      0                     The value '0000' is not valid.
1      1  The value 'GA1234' for <category> must be chan...
2      2              The value '.30' is not a valid entry.
3      3     The value 'Invitation for Party' is not valid.
4      4       On line '0010', the value 'CARD' is invalid.

In [185]: df['Message'] = df['Message'].str.replace(r"'.*?'", 'XXXXX')

In [186]: df
Out[186]:
   Index                                          Message
0      0                    The value XXXXX is not valid.
1      1  The value XXXXX for <category> must be changed.
2      2            The value XXXXX is not a valid entry.
3      3                    The value XXXXX is not valid.
4      4       On line XXXXX, the value XXXXX is invalid.

【讨论】:

  • 这是适当的pandas 响应(-:虽然我确实喜欢 Martijn 的正则表达式。
  • 熊猫版有效!我必须学习 .str.replace(r"'.*?'", 'XXXXX') 我会寻找可以找到这些通配符的地方,但这很有帮助。也在寻找正则表达式方法,以便我可以学习。
  • @ArthurD.Howland,很高兴我们能帮上忙 :)
【解决方案2】:

使用正则表达式:

import re

pattern = re.compile(r"'[^']+'")  # 1 or more characters between single quotes
result = pattern.sub('XXXXX', inputtext)

上面只接受两个单引号,中间有一个或多个字符(它们本身不是单引号)。

请参阅 Python 文档中包含的Regular Expression HOWTO,了解如何使用此类模式的良好介绍。

演示:

>>> import re
>>> pattern = re.compile(r"'[^']+'")
>>> pattern.sub('XXXXX', "The value '0000' is not valid.")
'The value XXXXX is not valid.'
>>> pattern.sub('XXXXX', "The value 'GA1234' for <category> must be changed.")
'The value XXXXX for <category> must be changed.'
>>> pattern.sub('XXXXX', "The value '.30' is not a valid entry.")
'The value XXXXX is not a valid entry.'
>>> pattern.sub('XXXXX', "The value 'Invitation for Party' is not valid.")
'The value XXXXX is not valid.'
>>> pattern.sub('XXXXX', "On line '0010', the value 'CARD' is invalid.")
'On line XXXXX, the value XXXXX is invalid.'

如果您有熊猫系列,请使用Series.replace();如果您设置regex=True,它也需要正则表达式,本质上充当re.sub() 调用系列中的所有值:

df.Message.replace(r"'[^']+'", 'XXXXX', regex=True)

演示:

>>> import pandas as df
>>> df = pd.DataFrame({
...     'Message': pd.Series([
...         "The value '0000' is not valid.",
...         "The value 'GA1234' for <category> must be changed.",
...         "The value '.30' is not a valid entry.",
...         "The value 'Invitation for Party' is not valid.",
...         "On line '0010', the value 'CARD' is invalid.",
...     ])
... })
>>> df.Message.replace(r"'[^']+'", 'XXXXX', regex=True)
0                      The value XXXXX is not valid.
1    The value XXXXX for <category> must be changed.
2              The value XXXXX is not a valid entry.
3                      The value XXXXX is not valid.
4         On line XXXXX, the value XXXXX is invalid.
Name: Message, dtype: object

【讨论】:

  • 您也可以使用pattern.search("The value '0000' is not valid").group() 仅查找匹配的文本。
  • pattern = re.compile(r"' [^']+ '") df['Revised'] = pattern.sub('XXXXXX', df.Message) 获取类型错误:预期字符串或类似字节的对象。
  • @ArthurD.Howland:使用Series.apply(),不要将整个Series传递给pattern.sub(..)
  • @ArthurD.Howland:换句话说,你不能仅仅矢量化模式替换。 df['Revised'] = df.Message.apply(lambda v: pattern.sub('XXXXX', v)).
  • @ArthurD.Howland:但是,Series.replace(..., regex=True) 让您可以直接对系列进行替换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
  • 2021-06-13
  • 1970-01-01
相关资源
最近更新 更多