繁体   English   中英

正则表达式 - 查找包含至少 1 个大写字母、一位数字或一个特殊字符的连续“单词”

[英]Regex - Find successive 'words' containing at least 1 capital letter, one digit or one special character

我正在尝试提取至少包含以下一项的单词序列:

  • 大写字母。
  • 数字
  • ':' 或者 '-'

例如对于以下短语:

  • aBC 一直在联系 Maria 和 James,他们的系统 DB-54:ABB 的 DDD 代码是 12343-4。

我想提取以下项目:

  • 广播公司
  • 玛丽亚
  • 詹姆士
  • DDD代码
  • DB-54:ABB
  • 12343-4

到目前为止,我有以下代码:

import re
re.findall(r'((\S*[A-Z|0-9|\:|\-]\w*)([\, |\.])?)', 'aBC has been contacting Maria and ere our DDD Code for system DB-54:ABB is 12343-4.')

哪个返回:

[('aBC ', 'aBC', ' '),
 ('Maria ', 'Maria', ' '),
 ('DDD ', 'DDD', ' '),
 ('Code ', 'Code', ' '),
 ('DB-54:ABB ', 'DB-54:ABB', ' '),
 ('12343-4.', '12343-4', '.')]

这将返回所有需要的项目,除了它正在拆分 DDD 和代码。 我的目标是将包含上述项目的连续单词组合在一起。 'DDD' 'Code' 都是大写字母,而且是连续的,应该属于同一个字符串

您可以添加+来重复该模式。 我对它进行了一些简化,因为您在不需要的地方使用了反斜杠。 这将产生您想要的 6 个捕获组:

((\S*[A-Z0-9:-]\w*)($|[ ,.]))+

演示

放入代码:

import re

m = re.findall(r'(((\S*[A-Z0-9:-]\w*)($|[ ,.]))+)',
               'aBC has been contacting Maria and James where their DDD Code for system DB-54:ABB is 12343-4.')

print(m)

Output:

[('aBC ', 'aBC ', 'aBC', ' '),
 ('Maria ', 'Maria ', 'Maria', ' '),
 ('James ', 'James ', 'James', ' '),
 ('DDD Code ', 'Code ', 'Code', ' '),
 ('DB-54:ABB ', 'DB-54:ABB ', 'DB-54:ABB', ' '),
 ('12343-4.', '12343-4.', '12343-4', '.')]

这不会拆分连续的比赛

result = re.findall(r'(?:[\w0-9]*[A-Z0-9\-:]+[\w0-9]*\s*)+', text)

但是您可能必须去除空格

map(str.strip, result)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM