Python Regex Split以一种奇怪的方式进行交互

时间:2018-09-30 05:18:12

标签: python regex formal-languages

我正在做我的形式语言作业,尝试使用{q0,q1,q2,q3},{a,b},q0,{q1,q3}

处理Python Regex遇到了麻烦

我有以下文字:

["q0,q1,q2,q3", "a,b", "q0", "q1,q3"]

必须拆分为:

String.join()

它始终以逗号分隔,并且包含字母数字值,该值可以以字母或数字开头。

为实现上述分离,我创建了这段非常长的代码,处理了Array.split()[x for x in ' '.join(' '.join(' '.join(args.split(',{')).split('}')).split('{')).split(' ') if x != '']

re.compile("(,{)|}|{|(},)")

我用REGEX尝试了以下操作,但它根本不起作用:

['', None, None, 'q0,q1,q2,q3', None, None, '', ',{', None, 'a,b', None, None, ',q0', ',{', None, 'q1,q3', None, None, '']

它返回我:

,{

处理所有这些虚假值很容易,但是为什么它将select Email='temp@sample.com',[Name]='TemplName' into ##testTempTable 之类的东西保留在数组中?

3 个答案:

答案 0 :(得分:3)

您可以使用简单的re.findall立即获得所需的内容。 (可选)重复单词字符,然后在组中重复逗号,然后以更多单词字符结束:

str = '{q0,q1,q2,q3},{a,b},q0,{q1,q3}'
re.findall(r'(?:\w+,)*\w+', str)

输出:

['q0,q1,q2,q3', 'a,b', 'q0', 'q1,q3']

答案 1 :(得分:1)

使用以下正则表达式:

import re

s = "{q0,q1,q2,q3},{a,b},q0,{q1,q3}"
m = re.findall(r"\{([A-Za-z0-9_,]+)\}|,([A-Za-z0-9_]+),", s)
if m:
    print(m)

答案 2 :(得分:1)

regex将在外部逗号之间找到任何内容,然后从大括号中删除它们(如果存在的话):

import re
s = '{q0,q1,q2,q3},{a,b},q0,{q1,q3}'
result = [i[1:-1] if i.startswith('{') else i for i in re.findall(r'[^,{]*(?:\{[^{}]*\})*[^,}]*', s) if i]
print(result)  # ['q0,q1,q2,q3', 'a,b', 'q0', 'q1,q3']

它也适用于ASCII字母以外的其他字符:

import re
s = '{q0,q1,q2,q3.?!},{a,b},q0,@,{q1,q3}'
result = [i[1:-1] if i.startswith('{') else i for i in re.findall(r'[^,{]*(?:\{[^{}]*\})*[^,}]*', s) if i]
print(result)  # ['q0,q1,q2,q3.?!', 'a,b', 'q0', '@', 'q1,q3']