在python中使用正则表达式分隔符拆分字符串

在python中使用正则表达式分隔符拆分字符串,python,regex,Python,Regex,我有以下字符串: txt='agadsfa_(2asdf_sdfsaf)asfsadf[adsf_klnalfk;jn234kmafs)adfs,nlnawr23' 这是分隔符: delimiters = " \t,;.?!-:@[](){}_*/" 作为输出,我需要以下值列表: "agadsfa","2asdf","sdfsaf","asfsadf","adsf","klnalfk","jn234kmafs","adfs","nlnawr23" 我尝试使用正则表达式: re.split(

我有以下字符串:

txt='agadsfa_(2asdf_sdfsaf)asfsadf[adsf_klnalfk;jn234kmafs)adfs,nlnawr23'
这是分隔符:

delimiters = " \t,;.?!-:@[](){}_*/"
作为输出,我需要以下值列表:

"agadsfa","2asdf","sdfsaf","asfsadf","adsf","klnalfk","jn234kmafs","adfs","nlnawr23"
我尝试使用正则表达式:

re.split(delimiters,txt)
但我得到了一个错误:

re.error: unterminated character set at position 10

这里怎么了?

您的正则表达式不正确。从注释中,您添加了一个要求,即不要触摸
分隔符
字符串

然后,我们需要做的是处理输入字符串并将其转换为适当的正则表达式,该正则表达式可由
split()
使用。以下是方法:

# need to enclose regex in [], we want to split on any of
# the chars; also some of the chars need to be escaped    
delimiters = ' \t,;.?!-:@[](){}_*/'
regex = delimiters.replace(']', '\]').replace('-', '\-')
regex = r'[{}]+'.format(regex)
结果如预期:

txt = 'agadsfa_(2asdf_sdfsaf)asfsadf[adsf_klnalfk;jn234kmafs)adfs,nlnawr23'
re.split(regex, txt)
=> ['agadsfa', '2asdf', 'sdfsaf', 'asfsadf', 'adsf', 'klnalfk', 'jn234kmafs', 'adfs', 'nlnawr23']

您必须使用
|
拆分分隔符:

delimiters = r' |\t|,|;|\.|\?|!|-|:|@|\[|\]|\(|\)|\{|\}|_|\*|/'
# then use this to eliminate empty strings if you have two delimiters next to each other
print([w for w in re.split(delimiters,txt) if w])   
# or list(filter(lambda a: a, re.split(delimiters,txt)))
结果是:

['agadsfa', '2asdf', 'sdfsaf', 'asfsadf', 'adsf', 'klnalfk', 'jn234kmafs', 'adfs', 'nlnawr23']
试试这个:

import re

txt = "agadsfa_(2asdf_sdfsaf)asfs?adf[adsf_klna!lfk;jn234kmafs)adfs, nlnawr*23"

line = re.sub(
           r"[ \t,;\.?!\-:@\[\](){}_*/]+", 
           r",", 
           txt
       )

print(line.split(","))
Python3代码

import re

txt="agadsfa_(2asdf_sdfsaf)asfsadf[adsf_klnalfk;jn234kmafs)adfs,nlnawr23"

delimiters = "_|;|,|\)|\(|\[|\]"

list(filter(None, re.split(delimiters, txt)))
输出

['agadsfa', '2asdf', 'sdfsaf', 'asfsadf', 'adsf', 'klnalfk', 'jn234kmafs', 'adfs', 'nlnawr23']

用|分隔符号,并使用pythons list filter函数避免空字符串

是否始终要捕获字母/数字A-Z A-Z 0-9?此处无需使用|,这就是字符类[]的用途。请参阅我的答案以获得更简洁的解决方案。过度的反斜杠看起来好像您不知道字符类中哪些字符是特殊的。只有字符类中的特殊字符需要转义Hanks Oscar,但我不能触摸分隔符字符串,这是由客户端确定的,我必须给他们一个函数,该函数将用提供的分隔符分隔输入字符串。@avinasse您没有选择,恐怕-提供的分隔符字符串不是在
split()
中使用它的有效正则表达式。您可以做的是获取分隔符字符串,转义特殊字符并将整个内容包含在
[…]+
中。这里不需要使用
|
,这就是字符类
[]
的用途。而一个正确构建的正则表达式使得
过滤器部分变得不必要。有关更简明的解决方案,请参见我的答案。