[英]Regex match in Python
我有這樣的正則表達式
r"^(.*?),(.*?)(,.*?=.*)"
和這樣的字符串
NAME1,值1,TAG11 = value11,tag12 = value12,tag13 = value13
我正在嘗試使用正則表達式檢查字符串是否遵循以下格式:以逗號分隔的name,value
,名稱和值對。
然后,我需要使用正則表達式提取逗號分隔的數據。
我將提取的數據作為第一組作為name1,將第二組作為value2提取,而第三組則完全從tag11匹配到value13(由於貪婪匹配)。
但是我想匹配每個名稱和值對。 我是Python新手,不確定如何實現此目標。
為什么不只用逗號分開:
s = 'name1,value1,tag11=value11,tag12=value12,tag13=value13'
print(s.split(','))
如果要使用正則表達式,使用模式就一樣簡單:
[^,]+
例:
事實證明,Python與.NET不同,它不支持重復的命名捕獲組,這有點可惜(這意味着我的解決方案比我想象的要長一點)。 這符合您的要求嗎?
import re
def is_valid(s):
pattern = '^name\d+,value\d+(,tag\d+=value\d+)*$'
return re.match(pattern, s)
def get_name_value_pairs(s):
if not is_valid(s):
raise ValueError('Invalid input: {}'.format(s))
pattern = '((?P<name1>\w+),(?P<value1>\w+))|(?P<name2>\w+)=(?P<value2>\w+)'
for match in re.finditer(pattern, s):
name1 = match.group('name1')
name2 = match.group('name2')
value1 = match.group('value1')
value2 = match.group('value2')
if name1 and value1:
yield name1, value1
elif name2 and value2:
yield name2, value2
if __name__ == '__main__':
testString = 'name1,value1,tag11=value11,tag12=value12,tag13=value13'
assert not is_valid('')
assert not is_valid('foo')
assert is_valid(testString)
print(list(get_name_value_pairs(testString)))
產量
[('name1', 'value1'), ('tag11', 'value11'), ('tag12', 'value12'), ('tag13', 'value13')]
編輯1
添加了輸入驗證邏輯。 做出的假設:
name<x>,value<x>
初始名稱/值對 tag<x>=value<x>
請注意,我目前不驗證x是名稱/值對中的相同值,我認為這是必要條件。 我不確定如何執行此操作 ,這只是讀者的練習。
首先,驗證格式acc。 到您的模式,然后使用[,=]
正則表達式(與,
和=
匹配)進行拆分,並轉換為這樣的字典:
import itertools, re
s = 'name1,value1,tag11=value11,tag12=value12,tag13=value13'
if re.match(r'[^,=]+,[^,=]+(?:,[^,=]+=[^,=]+)+$', s):
l = re.split("[=,]", s)
d = dict(itertools.izip_longest(*[iter(l)] * 2, fillvalue=""))
print(d)
else:
print("Not valid!")
參見Python演示
模式是
^[^,=]+,[^,=]+(?:,[^,=]+=[^,=]+)+$
詳細資料 :
^
-字符串的開頭(在re.match
,由於模式已經錨定,因此可以省略) [^,=]+
- 1+字符以外=
和,
,
-逗號 [^,=]+
- 1+字符以外=
和,
(?:,[^,=]+=[^,=]+)+
-1個或多個序列:
,
-逗號 [^,=]+
- 1+字符以外=
和,
=
-等號 [^,=]+
- 1+字符以外=
和,
$
-字符串結尾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.