Python正则表达式:删除所有未附加到单词的特殊字符和数字



我正在尝试删除python中的所有特殊字符和数字,除了直接附加到单词上的数字。

我已经成功地为所有特殊字符和数字附加和不附加到单词的情况做了这件事,如何做到附加的数字不匹配。

以下是我所做的:

import regex as re
string = "win32 backdoor guid:64664646 DNS-lookup h0lla"
re.findall(r'[^p{P}p{S}sd]+', string.lower())

我得到输出

赢得后门guid DNS查找h lla

但我想得到:

win32后门guid DNS查找h0lla

演示:https://regex101.com/r/x4HrGo/1

要匹配字母数字字符串或仅匹配字母单词,您可以使用以下re:模式

import re
# ...
re.findall(r'(?:[^Wd_]+d|d+[^Wd_])[^W_]*|[^Wd_]+', text.lower())

请参阅regex演示。

详细信息

  • (?:[^Wd_]+d|d+[^Wd_])[^W_]*-后面跟着一个数字的1+个字母,或者后面跟着一位字母的1+位数字,然后是0+个字母/数字
  • |-或
  • [^Wd_]+-任意1+Unicode字母

注意它相当于PJProudhon发布的d*[^Wd_][^W_]*模式,它匹配其中至少有1个字母的任何1+字母数字字符块。

您可以尝试bd*[^Wd_][^W_]*b

分解:

b       # word boundary
/d*      # zero or more digits
[^Wd_] # one alphabetic character
[^W_]*  # zero or more alphanumeric characters
b       # word boundary

对于初学者:

CCD_ 7是典型的双否定结构。在这里,您想要匹配任何不是字母数字或_的字符(Ww的否定,它匹配任何字母数字字符加上_——公共等效[a-zA-Z0-9_](。

它揭示了有用的组成:

  • 任何字母数字字符=[^W_]都与任何非[字母数字或_]且不是_的字符匹配
  • 任何字母字符=[^Wd_]与任何非[字母数字或_]且非数字(d(且非_的字符匹配

点击此处了解更多信息。


编辑:
_也被视为单词分隔符时,只需跳过切换该字符的单词边界,然后使用d*[^Wd_][^W_]*
星形运算符的默认贪婪将确保所有相关字符实际匹配。

演示。

改为尝试此RegEx:

([A-Za-z]+(d)*[A-Za-z]*)

您可以从这里展开它,例如,在第一个和最后一个集合上翻转*和+,以相等地捕获字符串,如"win32"one_answers"01ex"。

最新更新