2 回答

TA貢獻1862條經驗 獲得超7個贊
您可以使用
(?<!\w)(your|escaped|keywords|here)\W*([A-Z]*\d+(?:-+[A-Z]*\d+)*)
請參閱正則表達式演示。
圖案詳情
(?<!\w)
- 左字邊界(明確,\b
含義取決于上下文,如果下一個字符是非字字符,則左側需要一個字字符,這不是用戶通常期望的)(your|escaped|keywords|here)
-捕獲組1:您的關鍵字列表,可以很容易地使用內置'|'.join(map(re.escape,my_list))
(注意re.escape
是必要的轉義特殊的正則表達式的元字符像.
,+
,(
,[
,等)\W*
- 0+ 個非單詞字符(字母、數字或 以外的字符_
)([A-Z]*\d+(?:-+[A-Z]*\d+)*)
- 捕獲組 2:-+
- 一個或多個連字符[A-Z]*\d+
- 零個或多個大寫 ASCII 字母,1 個或多個數字[A-Z]*
- 零個或多個大寫 ASCII 字母\d+
- 1 位或更多位(?:-+[A-Z]*\d+)*
- 0 次或多次重復
請參閱Python 演示:
import re
s="""your_text_here"""
my_list = ['Ref.:', 'Reference', 'tramite', 'Expediente', 'Expediente No', 'Expedien N°', 'Exp.No', 'Expedien']
rx = r'(?<!\w)({})\W*([A-Z]*\d+(?:-+[A-Z]*\d+)*)'.format('|'.join(map(re.escape,my_list)))
print(re.findall(rx, s))
輸出:
[('Expedien', '1-21-212-16-26'), ('Reference', 'RE9833'), ('tramite', '1234567'), ('Expedien N°', '18-00777'), ('Expedien N°', '18-0022995')]

TA貢獻2016條經驗 獲得超9個贊
確實需要有一些東西允許少于 50 多個代表點的用戶發表評論,因為這個線程是我真的很好奇并且想要分叉的線程,但不想給出一個完整的答案上,因為我給出的答案涉及有限的情況并且不靈活。
@Wiktor Stribi?ew
您的解決方案錯過了“參考”?;谀难菔镜妮敵霾糠???雌饋硭胩^“tramite”
@checkmate
在您想要的輸出中,您需要對其進行編輯,因為“UV1234”不會出現在您發布的字符串中的任何位置
.
無論如何,我找到了一個解決方案,但我真的希望有人可以改進這一點。
>>> import re
>>> string = '''some text before Expedien: 1-21-212-16-26 some random text
Reference RE9833 of all sentences.
abc
123
456
something blah blah Ref.:
tramite 1234567
Ref.:
some junk Expedien N° 18-00777 # some new content
some text Expedien N°18-0022995 # some garbled content'''
>>> re.findall('(?:(Expedien[\s]+N\S|Ref\.(?!:[\S\s]{,11}Expedien)|Reference|Expedien))[\S\s]*?([A-Z\-]*(?:[\d]+)[\S]*)', string)
[('Expedien', '1-21-212-16-26'), ('Reference', 'RE9833'), ('Ref.', '1234567'), ('Expedien N\xb0', '18-00777'), ('Expedien N\xb0', '18-0022995')]
缺陷:
為了正確捕獲它部分依賴于“Ref.(?!:[\S\s]{,11}Expedien)”
首先,需要編輯“11”以考慮可能存在的其他長度的信息,因此它不靈活
其次,如果后面是“參考”而不是第三個“參考”。將被錯誤地捕獲
添加回答
舉報