Python Regex Split 以一种奇怪的方式进行交互
Python Regex Split interacting in a weird way
我正在做我的形式语言作业,我在尝试使用 regex.split(param)
处理 Python 正则表达式时遇到了一些麻烦
我有以下文字:
{q0,q1,q2,q3},{a,b},q0,{q1,q3}
必须拆分为:
["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 != '']
我用 REGEX 尝试了以下方法,但它根本不起作用:
re.compile("(,{)|}|{|(},)")
它returns我:
['', None, None, 'q0,q1,q2,q3', None, None, '', ',{', None, 'a,b', None, None, ',q0', ',{', None, 'q1,q3', None, None, '']
很容易处理所有这些错误的值,但为什么要在数组中保留 ,{
之类的东西?
使用以下正则表达式:
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)
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']
您可以通过简单的 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']
我正在做我的形式语言作业,我在尝试使用 regex.split(param)
我有以下文字:
{q0,q1,q2,q3},{a,b},q0,{q1,q3}
必须拆分为:
["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 != '']
我用 REGEX 尝试了以下方法,但它根本不起作用:
re.compile("(,{)|}|{|(},)")
它returns我:
['', None, None, 'q0,q1,q2,q3', None, None, '', ',{', None, 'a,b', None, None, ',q0', ',{', None, 'q1,q3', None, None, '']
很容易处理所有这些错误的值,但为什么要在数组中保留 ,{
之类的东西?
使用以下正则表达式:
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)
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']
您可以通过简单的 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']