我需要一个正则表达式,它使用下一个规则将输入字符串拆分为列表:
1)用点;
2)如果是引号,请不要拆分表达式
例子:
'a.b.c' -> ['a', 'b', 'c'];
'a."b.c".d' -> ['a', 'b.c', 'd'];
'a.'b.c'.d' -> ['a', 'b.c', 'd'];
'a.'b c'.d' -> ['a', 'b c', 'd'];
答案 0 :(得分:1)
您可以使用以下表达式来使用较新的regex
模块:
\b
这会捕获引号,将它们匹配到下一个引号并让匹配的部分失败。交替是点。
<小时/> 在(["']).*?\1(*SKIP)(*FAIL)|\.
:
Python
哪个收益
import regex as re
data = """
a.b.c
a."b.c".d
a.'b.c'.d
a.'b c'.d
"""
rx = re.compile(r"""(["']).*?\1(*SKIP)(*FAIL)|\.""")
for line in data.split("\n"):
if line:
parts = [part.strip("'").strip('"') for part in rx.split(line) if part]
print(parts)
<小时/>
如果您想坚持使用['a', 'b', 'c']
['a', 'b.c', 'd']
['a', 'b.c', 'd']
['a', 'b c', 'd']
模块,您可以替换之前的点,然后通过替换进行拆分。
re
这产生与上面完全相同的输出。请注意,这两种方法都不适用于转义引号。
答案 1 :(得分:0)
你可以在这里做一些额外的努力,你怎么做。
首先用'。'拆分然后做一些逻辑上的工作。
string_data = 'a."b.c".d'
data = string_data.split('.')
list = []
value = None
for i in range(0,len(data)):
if value:
value = None
else:
if '"' in data[i]:
value = data[i]
value = value + '.' + data[i+1]
if value:
list.append(value)
else:
list.append(data[i])
print(list)
它会为你提供与qus相同的输出。
答案 2 :(得分:0)
作为替代方案,您可以尝试使用或|
带有正面的后置(?<=
和正向前瞻(?=
的单引号和双引号
(?<=").*?(?=")|(?<=').*?(?=')|[a-z]+
regex = r"(?<=\").*?(?=\")|(?<=').*?(?=')|[a-z]+"
line = "a.\"b.t\".qq.d.d.'d'.'d.g.r'.d.d"
print(re.findall(regex, line))
['a','b.t','qq','d','d','d','。','dgr','d','d']
答案 3 :(得分:-1)
这是一个regex for you:
\.?([^\"\'\.]+)|\"(.+)\"|\'(.+)\'\.?
实现:
import re
regex = re.compile( r"""\.?([^\"\'\.]+)|\"(.+)\"|\'(.+)\'\.?""")
def str2list(string):
b = regex.findall(string)
l = []
for i in list(b):
for j in list(i):
if j:
l.append(j)
return l
str2list('a.b.c')
str2list('a."b.c".d')
str2list("a.'b.c'.d")
输出:
['a', 'b', 'c']
['a', 'b.c', 'd']
['a', 'b.c', 'd']