簡體   English   中英

在開始和結束模式python正則表達式之間多次查找模式

[英]Finding a pattern multiple times between start and end patterns python regex

我試圖在多行的開始和結束模式之間找到某種模式。 這是我的意思:

我讀取了一個文件並將其保存在變量File中,這就是原始文件的樣子:

文件:

...
...
...
Keyword some_header_file {
   XYZ g1234567S7894561_some_other_trash_underscored_text;
   XYZ g1122334S9315919_different_other_trash_underscored_text;
}
...
...
...

我正在嘗試抓住g和S之間的1234567以及1122334 some_header_file塊可以是任意數量的行,但始終以}結尾。因此,我嘗試從特定關鍵字的“關鍵字”到“}”的所有行在g和S之間准確地抓住7位數字。

這是我用的:

    FirstSevenDigitPart = str(re.findall(r"Keyword\s%s.*\n.*XYZ\s[gd]([0-9]{7})[A-Z][0-9]{7}.*\}"%variable , str(File) , flags=re.MULTILINE))

但是不幸的是它什么也沒返回。.只是空白[]我在做什么錯? 我怎樣才能做到這一點? 提前致謝。

我認為這里最簡單的方法是使用兩個表達式並分兩步運行它。 有一個小例子。 當然,您應該根據需要對其進行優化。

import re
text = """Keyword some_header_file {
XYZ g1234567S7894561_some_other_trash_underscored_text;
XYZ g1122334S9315919_different_other_trash_underscored_text;
}"""

all_lines_pattern = 'Keyword\s*%s\s*\{\n(?P<all_lines>(.|\s)*)\}'
first_match = re.match(all_lines_pattern % 'some_header_file', text)
if first_match is None:
    # some break logic here
    pass
found_lines = first_match.group(1)
print(found_lines) # '    XYZ g1234567S7894561_some_other_trash_underscored_text;\n    XYZ g1122334S9315919_different_other_trash_underscored_text;\n    '
sub_pattern = '(XYZ\s*[gd](?P<your_pattern>[0-9]{7})[A-Z]).*;'
found_groups = re.findall(sub_pattern, found_lines)
print(found_groups)  #   [('XYZ g1234567S', '1234567'), ('XYZ g1122334S', '1122334')]

您可以將文件讀入contents變量並使用

import re

contents = "...\n...\n...\nKeyword some_header_file {\n   XYZ \ng1234567S7894561_some_other_trash_underscored_text;\n   XYZ \n1122334S9315919_different_other_trash_underscored_text;\n}\n...\n...\n..."
results = []
variable = 'some_header_file'
block_rx = r'Keyword\s+{}\s*{{([^{{}}]*)}}'.format(re.escape(variable))
value_rx = r'XYZ\s[gd]([0-9]{7})[A-Z][0-9]{7}'
for block in re.findall(block_rx, contents):
    results.extend(re.findall(value_rx, block))

print(results)
# => ['1234567', '1122334']

參見Python演示

第一個正則表達式( block_rx )看起來像Keyword\\s+some_header_file\\s*{([^{}]*)} ,並將匹配您需要在其中搜索值的所有塊。第二個正則表達式XYZ\\s[gd]([0-9]{7})[AZ][0-9]{7} ,匹配您需要的內容並返回捕獲列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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