想象一下我有以下熊猫系列:
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表的标点符号
答案 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