![](/img/trans.png)
[英]How do I extract location names from a string with mixed commas and quotation marks? (using Regex or any other methods)
[英]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.