删除仅是熊猫系列中标点符号的单词

时间:2020-04-27 21:19:29

标签: python regex pandas

想象一下我有以下熊猫系列:

tmp = pd.Series(['k.; mlm', '(+).', 'a;b/c', '!".: abc', 'abc dfg', 'qwert@'])

我想对于所有元素,使用正则表达式删除仅标点符号的单词,我试图使用类似以下内容的单词:

tmp.str.replace(regex, '')

我的最后系列是:

tmp = pd.Series(['k.; mlm', '', 'a;b/c', 'abc', 'abc dfg', 'qwert@'])

编辑:我正在考虑使用unicode表的标点符号

4 个答案:

答案 0 :(得分:2)

您可以将str.contains与模式:value配合使用,以匹配包含至少一个不是标点符号的字符的字符串。

请注意,[^\W]与集合中包含的任何字符匹配,并且通过在开头添加[],将匹配集合中所有未包含的字符。

^

答案 1 :(得分:1)

您可以将str.replace与负前瞻正则表达式一起使用,它查找包含任何字母数字字符(用\ w表示)的字符串

tmp.replace('^((?!\w).)*$', '', regex=True)

0     k.; mlm
1            
2       a;b/c
3    !".: abc
4     abc dfg
5      qwert@

答案 2 :(得分:1)

IICU

tmp.replace('[()+!".:]', '', regex=True).to_list()

结果

['k; mlm', '', 'a;b/c', ' abc', 'abc dfg', 'qwert@']

说明 在这种情况下,[]包含要匹配的字符 df. replace将to_replace中给出的值替换为value。我设置了Regex = True,因为我使用了正则表达式。 最后,我通过df.to_list()函数将它们转换为列表

答案 3 :(得分:1)

如果整个字符串包含标点符号,则好像您打算清除字段值(将其全部替换为空字符串)。

您可以使用

tmp.str.replace(r'^(?:[^\w\s]|_)+$', '')

请参见regex demo注意:如果您仅打算清除仅包含 ASCII标点符号的行的值,则可以使用string.punctuation

tmp.str.replace(f"^[{''.join(map(re.escape,string.punctuation))}]+$", '')

print(f"[{''.join(map(re.escape,string.punctuation))}]")显示[!"\#\$%\&'\(\)\*\+,\-\./:;<=>\?@\[\\\]\^_`\{\|\}\~],请参阅its online demo。如预期的那样,它与«»等标点符号不匹配。

详细信息

  • ^-字符串的开头
  • (?:-一个非捕获组的开始
    • [^-否定字符类的开始(它将匹配所有字符,但要匹配其中指定的所有字符):
      • \w-单词字符(任何Unicode字母,数字和_
      • \s-任何Unicode空格
    • ]+-课程结束,+重复1次或更多次
    • |-或
    • _-下划线
  • )-组结束
  • $-字符串的结尾。

熊猫测试:

>>> tmp.str.replace(r'^(?:[^\w\s]|_)+$', '')
0     k.; mlm
1            
2       a;b/c
3    !".: abc
4     abc dfg
5      qwert@
dtype: object