亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Python 中匹配字符串的特定模式之后獲取數字

在 Python 中匹配字符串的特定模式之后獲取數字

慕婉清6462132 2021-11-30 16:35:08
我想獲取所有匹配的數字(僅數字示例 '0012--22')或包含與其對應的一些文本(示例 'RF332')的數字,這些文本與提供的字符串列表匹配(代碼中的“my_list”) . 帶有數字的文本出現的格式就像用一兩個空格分隔。提供示例輸入文件以供參考。這是輸入文件:$cat input_filesome text before Expedien: 1-21-212-16-26 some random textReference RE9833 of all sentences.abc123456something blah blah Ref.: tramite  1234567Ref.:some junk Expedien N° 18-00777 # some new contentsome text Expedien N°18-0022995 # some garbled content到目前為止的腳本附在下面:它目前只識別一個元素,它是 {'tramite': '1234567'}import reimport globimport osmy_list = ['Ref.:', 'Reference', 'tramite', 'Expediente', 'Expediente No', 'Expedien N°', 'Exp.No', 'Expedien']#open the file as inputwith open('garb.txt','r') as infile:  res = dict()  for line in infile:      elems = re.split('(?::)?\s+', line)    #print(elems)    if len(elems) >= 2 :      contains = False      tmp = ''      for elem in elems:          if contains:          res.update({tmp : elem})          print(res)          contains = False          break        if elem in my_list:          contains = True          tmp = elem  #print(res)這是預期的輸出:示例輸出:{'Expedien N°': '18-0022995'}{'Expedien N°': '18-0022995'}{'Expedien': '1-21-212-16-26'}{'Reference' : 'RE9833'}等等等等
查看完整描述

2 回答

?
牧羊人nacy

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')]



查看完整回答
反對 回復 2021-11-30
?
慕沐林林

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”以考慮可能存在的其他長度的信息,因此它不靈活

其次,如果后面是“參考”而不是第三個“參考”。將被錯誤地捕獲


查看完整回答
反對 回復 2021-11-30
  • 2 回答
  • 0 關注
  • 217 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號