我正在寻找一个正则表达式来提取仅包含字母数字字符的单词:
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']
有没有一个正规表达式可以实现这一目标?我尝试了不同的方法,但是无法提出解决方案。
答案 0 :(得分:3)
而不是单词边界,而是在后面和前面先查找空格(或字符串的开头/结尾):
(?:^|(?<= ))[a-zA-Z0-9]+(?= |$)
https://regex101.com/r/TZ7q1c/1
请注意,“ a”是一个独立的字母数字单词,因此也包含在内。
['This', 'is', 'a', 'sign']
答案 1 :(得分:3)
为此,无需使用正则表达式,python具有内置的isalnum
字符串方法。见下文:
string = 'This is a $dollar sign !!'
matches = [word for word in string.split(' ') if word.isalnum()]
答案 2 :(得分:0)
[感谢Khabz的评论进行编辑。我误解了这个问题]
根据您的意图,您也可以“拆分”而不是“匹配”。
>>> 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()并不是一个好主意。