![](/img/trans.png)
[英]SQLAlchemy returning <Name1>, <Name2> values etc
[英]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.