簡體   English   中英

Python中的正則表達式匹配

[英]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(','))

如果要使用正則表達式,使用模式就一樣簡單:

[^,]+

例:

https://regex101.com/r/jS6fgW/1

事實證明,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.

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