我试图从文本中提取具有长度大于8的数字/字母数字字符的标记/部分标记
例如:
text = 'https://stackoverflow.com/questions/59800512/ 510557XXXXXX2302 Normal words 1601371803 NhLw6NlR0EksRWkLddEo7NiEvrg https://www.google.com/search?q=some+google+search&oq=some+google+search&aqs=chrome..69i57j0i22i30l8j0i390.4672j0j7&sourceid=chrome&ie=UTF-8'
预期产出将是:
59800512 510557XXXXXX2302 1601371803 NhLw6NlR0EksRWkLddEo7NiEvrg 69i57j0i22i30l8j0i390 4672j0j7
我尝试使用正则表达式:((\d+)|([A-Za-z]+\d)[\dA-Za-z]*)
基于答案Python Alphanumeric Regex。我得到了以下结果:
[match for match in re.findall(r"((\d+)|([A-Za-z]+\d)[\dA-Za-z]*)",text)]
Output :
[('59800512', '59800512', ''),
('510557', '510557', ''),
('XXXXXX2302', '', 'XXXXXX2'),
('1601371803', '1601371803', ''),
('NhLw6NlR0EksRWkLddEo7NiEvrg', '', 'NhLw6'),
('69', '69', ''),
('i57j0i22i30l8j0i390', '', 'i5'),
('4672', '4672', ''),
('j0j7', '', 'j0'),
('8', '8', '')]
我将为每个匹配令牌获取匹配组的元组
可以再次过滤这些元组。但我正在努力使代码尽可能高效和通俗
有人能提出解决办法吗?它不需要基于正则表达式
提前谢谢
编辑: 我希望字母数字值的长度等于或大于8
结果中包含元组,因为re.findall返回捕获组的值
但是您可以省略捕获组,并将模式更改为单个匹配,在字符a-Z a-Z之间至少匹配一个数字,并使用正向先行断言至少8个字符
\b
单词边界(?=[A-Za-z0-9]{8})
正向前瞻,断言列出的任何范围至少出现8次[A-Za-z]*
可选地匹配字符a-Z a-Z\d
匹配一个数字[A-Za-z\d]*
可选匹配字符a-Z a-Z或数字\b
单词边界见aregex demo或aPython demo
输出
虽然所选答案返回所需的输出,但它不是泛型的,并且无法匹配特定的情况(例如
s= "thisword2H2g2d"
)对于适用于所有字母数字值组合的更通用的正则表达式:
result = re.findall(r"(\d+[A-Za-z\d]+\d*)|([A-Za-z]+[\d]+[A-Za-z\d]*)")
请参阅演示here
我想到了:
请参阅联机demo
\b
-字边界李>[A-Za-z]{,7}
-0-7倍一个字母字符李>\d
-一个单位数李>[A-Za-z\d]{7,}
-7+乘以一个字母数字字符李>\b
-字边界李>一些示例代码:
印刷品:
您可以选择将不区分大小写与以下内容匹配:
相关问题 更多 >
编程相关推荐