正则表达式:要匹配的表达式 'name1: A=a name2:B=b name3:C=c d'

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

我正在使用 Python 的 re module's re.compile() 拆分 name1:A=a name2:B=b name3:C=c d 变成:

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

这是我现在的正则表达式:

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

但它最终给我的输出是:

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

粗体文本是它正在捕获的文本。单词 A、B 和 C 来自预定义的标题列表,即只有这些单词会出现在 '=' 符号之前。

您需要指出下一场比赛的优势。这里的换行符或文本结尾完成了这项工作。

(\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 是如何处理的。

您可以尝试匹配相关部分而不是拆分:

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 上的 a demo for the expression

如果您被限制使用拆分,请使用下面的正则表达式。

\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']