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

2024-06-02 23:32:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图删除python中的所有特殊字符和数字,除了直接附加到单词的数字。你知道吗

我已经成功地做到了所有特殊字符和数字的情况下附加和不附加的话,如何做到这样的方式,附加的数字不匹配。你知道吗

以下是我所做的:

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

我得到了输出

win backdoor guid DNS lookup h lla

但我想得到:

win32 backdoor guid DNS lookup h0lla

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


Tags: importrestringdns方式情况数字lookup
3条回答

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

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

参见regex demo。你知道吗

细节

  • (?:[^\W\d_]+\d|\d+[^\W\d_])[^\W_]*-1+个字母后跟一个数字,或者1+个数字后跟一个字母,然后是0+个字母/数字
  • |-或
  • [^\W\d_]+-任何1+Unicode字母

注意它相当于^{} patternposted by PJProudhon,匹配任何1+个字母数字字符块,其中至少有1个字母。你知道吗

你可以试试^{}

分解:

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

对于初学者:

[^\W]是典型的双反结构。这里您想要匹配任何不是字母数字的字符或_\W\w的否定,它匹配任何字母数字字符加上_-公共等价物[a-zA-Z0-9_])。你知道吗

它揭示了在这里写作的有用之处:

  • 任何字母数字字符=[^\W_]与任何非[字母数字或_]且非_的字符匹配。你知道吗
  • 任何字母字符=[^\W\d_]与任何非[字母数字或_]且非数字(\d)且非_的字符匹配。你知道吗

进一步阅读here。你知道吗


编辑:
_也被认为是一个单词分隔符时,只需跳过单词边界即可切换该字符,并使用\d*[^\W\d_][^\W_]*
星运算符的默认贪婪度将确保所有相关字符实际匹配。你知道吗

Demo。你知道吗

请尝试使用以下正则表达式:

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

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

相关问题 更多 >