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

Python regex: removing all special characters and numbers NOT attached to words

我正在尝试删除 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

试试这个正则表达式:

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

您可以从这里扩展它,例如翻转第一组和最后一组的 * 和 + 以平等地捕获像 "win32" 和“01ex”这样的字符串。

要匹配 字母数字字符串或仅匹配字母单词,您可以将以下模式与 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+ letters/digits
  • | - 或
  • [^\W\d_]+ - 任何 1+ Unicode 字母

NOTE 等同于\d*[^\W\d_][^\W_]* pattern ,匹配任何1+个字母数字字符块,其中至少有1个字母。

你可以试试\b\d*[^\W\d_][^\W_]*\b

分解:

\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_]*.
star 运算符的默认贪婪将确保所有相关字符实际匹配。

Demo.