检测python字符串中的字母数字/数字值

2024-05-13 02:51:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从文本中提取具有长度大于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


Tags: texthttps标记comsearchmatchgoogle字母
3条回答

结果中包含元组,因为re.findall返回捕获组的值

但是您可以省略捕获组,并将模式更改为单个匹配,在字符a-Z a-Z之间至少匹配一个数字,并使用正向先行断言至少8个字符

\b(?=[A-Za-z0-9]{8})[A-Za-z]*\d[A-Za-z\d]*\b
  • \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

import re
from pprint import pprint

pattern = r"\b(?=[A-Za-z0-9]{8})[A-Za-z]*\d[A-Za-z\d]*\b"
s = "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"

pprint(re.findall(pattern, s))

输出

['59800512',
 '510557XXXXXX2302',
 '1601371803',
 'NhLw6NlR0EksRWkLddEo7NiEvrg',
 '69i57j0i22i30l8j0i390',
 '4672j0j7']

虽然所选答案返回所需的输出,但它不是泛型的,并且无法匹配特定的情况(例如s= "thisword2H2g2d"

对于适用于所有字母数字值组合的更通用的正则表达式:

result = re.findall(r"(\d+[A-Za-z\d]+\d*)|([A-Za-z]+[\d]+[A-Za-z\d]*)")

请参阅演示here

我想到了:

\b[A-Za-z]{,7}\d[A-Za-z\d]{7,}\b

请参阅联机demo

  • \b-字边界
  • [A-Za-z]{,7}-0-7倍一个字母字符
  • \d-一个单位数
  • [A-Za-z\d]{7,}-7+乘以一个字母数字字符
  • \b-字边界

一些示例代码:

import re
s = "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"
result = re.findall(r'\b[A-Za-z]{,7}\d[A-Za-z\d]{7,}\b', s)
print(result)

印刷品:

['59800512', '510557XXXXXX2302', '1601371803', 'NhLw6NlR0EksRWkLddEo7NiEvrg', '69i57j0i22i30l8j0i390', '4672j0j7']

您可以选择将不区分大小写与以下内容匹配:

(?i)\b[a-z]{,7}\d[a-z\d]{7,}\b

相关问题 更多 >