簡體   English   中英

用於重疊/混合行的 REGEX

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM