正则表达式仅提取字母数字词

Regex to extract ONLY alphanumeric words

我正在寻找一个正则表达式来提取仅包含字母数字字符的单词:

string = 'This is a $dollar sign !!'
matches = re.findall(regex, string)
matches = ['This', 'is', 'sign']

这可以通过标记字符串并使用以下正则表达式单独评估每个标记来完成:

^[a-zA-Z0-9]+$

由于性能问题,我希望能够在不标记整个字符串的情况下提取字母数字标记。我最接近的是

regex = \b[a-zA-Z0-9]+\b

,但它仍然提取包含字母数字字符的子字符串:

string = 'This is a $dollar sign !!'
matches = re.findall(regex, string)
matches = ['This', 'is', 'dollar', 'sign']

是否有正则表达式能够解决这个问题?我尝试了不同的方法,但无法提出解决方案。

代替单词边界,对空格(或字符串的 beginning/end)进行后视和前视:

(?:^|(?<= ))[a-zA-Z0-9]+(?= |$)

https://regex101.com/r/TZ7q1c/1

请注意,"a" 是一个独立的字母数字词,因此也包含在内。

['This', 'is', 'a', 'sign']

不需要为此使用正则表达式,python 有一个内置的 isalnum 字符串方法。见下文:

string = 'This is a $dollar sign !!'

matches = [word for word in string.split(' ') if word.isalnum()]

[根据 Khabz 的评论进行编辑。我误解了问题]

根据您的意图,您也可以 "split" 而不是 "match"。

 >>> matches = re.split(r'(?:\s*\S*[$\!]+\S*\s*|\s+)', string)

 ['This', 'is', 'a', 'sign', '']

如果您需要删除前导或尾随空字符串:

>>> matches = [x for x in re.split(r'(?:\s*\S*[$\!]+\S*\s*|\s+)', a) if x ]
['This', 'is', 'a', 'sign']

CertainPerformance 使用后视和前视的响应是最紧凑的。当指定排除时,使用 split 有时是有利的,即上面的正则表达式描述了需要排除的内容。然而,在这种情况下,指定的是包含字母数字,因此使用 split() 不是一个好主意。