[英]REGEX for overlapped/intermingled rows
我有這個非常煩人的問題,這是由狡猾的 PDF 數字化引起的。
無論如何,理想情況下,一系列具有不同列的行將表示如下:
Code Cost Quantity
ABC 45.00 4
FED 60.00 5
GHK 30.00 5
使用正則表達式很容易將它們拆分為行,然后獲取每個單獨的列。
但是,我發現一個特別煩人的文本總是這樣出現:
Code Cost Quantity
ABC FED GHK 45.00 60.00 30.00 4 5 5
我一生都無法弄清楚如何讓正則表達式分離出每個重疊的行,就像第一個例子一樣。 積極的前瞻可以讓我得到一些幫助,但通常會發生 ABC 45.00 4 然后是 FED 45.00 4,我建立的前瞻不會遍歷所有單獨的列。
我的懷疑是我可以使用命名模式或其他東西,匹配第一組:
(?>(?<match1>((?>\s|\b)\w{3}\s).+\s+\s(\d+\.\d{2})\s.*\s+\s(\d{1})\s.*))
然后以某種方式重用該捕獲組,對其進行迭代。
向前看只會迭代第一組,所以我顯然在做一些愚蠢的事情:
https://regex101.com/r/Uxx8bZ/1
從理論上講,我可以通過其他方式將行分開(例如,對於每個大空間,這是一列),但似乎這應該是可能的。
幫助表示贊賞!
在示例數據中,隨附的數據是 3 次空白字符,然后是右側的非空白字符。
如果該結構始終相同,您可以捕獲大寫字符,並捕獲前瞻斷言中的其他 2 個字段。
([A-Z]+)(?=\s+\S+\s+\S+\s+(\d+(?:\.\d+)?)\s+\S+\s+\S+\s+(\d+))
([AZ]+)
在第 1 組中捕獲 1+ 次 char AZ(?=
正向前瞻,向右斷言
\s+\S+\s+\S+\s+(\d+(?:\.\d+)?)
在 3 個字段之后,在第 2 組中捕獲 1+ 個帶有可選小數部分的數字\s+\S+\s+\S+\s+(\d+)
3個字段后,捕獲組3中的1+位)
關閉前瞻查看正則表達式演示
使用re.findall 檢索捕獲組值的示例:
import re
pattern = r"([A-Z]+)(?=\s+\S+\s+\S+\s+(\d+(?:\.\d+)?)\s+\S+\s+\S+\s+(\d+))"
s = r"ABC FED GHK 45.00 60.00 30.00 4 5 5"
print(re.findall(pattern, s))
Output
[('ABC', '45.00', '4'), ('FED', '60.00', '5'), ('GHK', '30.00', '5')]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.