簡體   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