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
试试这个正则表达式:
([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 # 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.
我正在尝试删除 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
试试这个正则表达式:
([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
分解:
\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.