簡體   English   中英

如何提取由<>界定並以逗號分隔的引號引起的元素列表-python,regex?

[英]How do i extract a list of elements encased in quotation marks bounded by <> and delimited by commas - python, regex?

給定這樣的字符串:

ORTH < "cali.ber,kl", 'calf' , "done" >,\nLKEYS.KEYREL.PRED "_calf_n_1_rel", 

使用正則表達式,如何獲得如下元組:

('ORTH', ['cali.ber,kl','calf','done'])

我一直在這樣做:

txt = '''ORTH < "cali.ber,kl", 'calf' , "done" >,'''
e1 = txt.partition(" ")[0]
vs = re.search(r"<([A-Za-z0-9_]+)>", txt)
v = vs.group(1)
v1 = [i[1:-1] for i in vs.strip().strip("<>").split(",")]
print v1

但是我對於re.search().group(1) 如何獲得所需的輸出?

您沒有找到匹配項的原因是您的正則表達式不匹配:

r"<([A-Za-z0-9_]+)>"缺少逗號,引號和空格字符,所有這些都可能出現在< >內部,具體< >您的示例。

這將匹配:

re.search(r"< ([A-Za-z0-9_.,\"' ]+) >", txt)

可能還會令您失望的是,名稱列表由逗號分隔,而逗號本身可以是未轉義的值的一部分。

這意味着您不能只用','分割字符串,而是需要考慮兩個不同的引號字符( '" )以分隔字段。

所以我會使用這種方法:

  • 使用re.match將字符串拆分為PREFIX <NAMES>部分,並丟棄其余部分。
  • 使用re.findall()根據引號將名稱分成多個字段

編輯:

1)根據您的第一個評論,您的數據還可以在包含換行符的前綴之前包含一個前導。 的默認行為. 匹配換行符以外的所有東西

從Python re docs:

re.DOTALL

標記為'.' 特殊字符完全匹配任何字符,包括換行符; 沒有此標志, '.' 將匹配換行符以外的任何內容。

因此,您需要使用re.DOTALL標志構造該正則表達式。 您可以通過先編譯並傳遞OR ed標志來做到這一點:

re.compile(pattern, flags=re.DOTALL)

2)如果您在正則表達式中的PREFIX之前包含空格字符,則它將僅與實際包含該空格的數據匹配-但不再與您的第一段示例數據匹配。 所以我用.*?([AZ\\.]*)...來覆蓋這兩種情況。 ? 用於非貪婪匹配,因此它匹配的是最短匹配而不是最長匹配。

3)要覆蓋PREFIX.FOO只需通過將前綴擴展為([AZ\\.]*) . 角色並轉義。

更新的示例涵蓋了您提到的所有情況:

import re

TEST_VALUES = [
    """ORTH.FOO < "cali.ber,kl", 'calf' , "done" >,\nLKEYS.KEYREL.PRED "_calf_n_1_rel",""",
    """calf_n1 := n_-_c_le & n_-_pn_le &\n [ ORTH.FOO < "cali.ber,kl", 'calf' , "done" >,\nLKEYS.KEYREL.PRED "_calf_n_1_rel","""
]

EXPECTED = ('ORTH.FOO', ['cali.ber,kl','calf','done'])


pattern = re.compile(r'.*?([A-Z\.]*) < (.*) >.*', flags=re.DOTALL)


for value in TEST_VALUES:
    prefix, names_str = pattern.match(value).groups()
    names = re.findall('[\'"](.*?)["\']', names_str)

    result = prefix, names
    assert(result == EXPECTED)

print result

暫無
暫無

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

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