簡體   English   中英

正則表達式:匹配 'name1: A=a name2:B=b name3:C=cd' 的表達式

[英]Regex: expression to match 'name1: A=a name2:B=b name3:C=c d'

我正在使用 Python 的re 模塊re.compile()name1:A=a name2:B=b name3:C=cd拆分為:

name1 A=a, name2 B=b, name3 C=c d

這是我現在的正則表達式:

(\w+): (A|B|C)(=[\w+\s*\w*]+)

但它最終給了我輸出:

名稱1:A=a 名稱2 :B=b名稱3 :C=cd

粗體文本是它正在捕獲的文本。 單詞 A、B 和 C 來自預定義的標題列表,即只有這些會出現在'='符號之前。

您可以嘗試匹配相關部分,而不是拆分:

import re

text = "name1:A=a name2:B=b name3:C=c d"

rx = re.compile(r'\w+:(?:\w+(?:=\w+)?(?:\s+|$))+')

for match in rx.finditer(text):
    name, rest = match.group(0).split(":")
    print("{}, {}".format(name, rest))

這產生

name1, A=a 
name2, B=b 
name3, C=c d

請參閱 regex101.com 上的表達式演示

您需要指出下一場比賽的優勢。 在這里換行或文本結束完成了這項工作。

(\w+): [ABC](=\w+\s*\w*)(?:\n|$)

順便說一句,源包含一個“,”,而在您的正則表達式中,名稱后使用了一個“:”。

這是一個單行字符串的解決方案。

(\w+): (A|B|C)(=\w+\s*\w*?\(?:\s+|$))

這並不能完全回答您的問題,但很高興知道您可以在不使用正則表達式的情況下獲得您想要的:

import itertools

my_string =  "name1 A:a name2 B:b name3 C:c  d"
# split on whitespaces
split_string = my_string.split()
# get only the even elements
evens = split_string[0::2]
# get only the odd elements
odds = split_string[1::2]
# get the A=a format you want
new_odds = [odd.replace(":", "=") for odd in odds]
# zip the lists together, without losing any elements from the longer list
zipped = itertools.zip_longest(evens, new_odds)
# make this zip a list for us to view it
zipped_as_list = [x for x in zipped]
# look at what we made
print(zipped_as_list)

我不知道你最終想要什么形狀的數據,或者尾隨的d應該如何處理。

如果您僅限於使用拆分,請使用下面的正則表達式。

\s(?=\w+:)|:

例子

import re
text="name1:A=a name2:B=b name3:C=c d"
print(re.split(r"\s(?=\w+:)|:",text))

輸出

['name1', 'A=a', 'name2', 'B=b', 'name3', 'C=c d']

暫無
暫無

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

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