【发布时间】:2016-02-25 22:26:53
【问题描述】:
我有这个字符串:
s = MY_FUNC(AVG, WFC US EQUITY, WFC US EQUITY, ">+3%", 1,1,7)
还有这个搜索括号、逗号和简单运算符的正则表达式。我需要排除双引号内的任何匹配项并能够拆分匹配项。请注意,解决方案仍必须在字符串的其余部分中搜索括号、逗号和运算符。 当前版本的正则表达式是:
tokenize_regex = re.compile(r'([\[\]\(\)\+\-\*/<>=!,])')
s 的匹配项是:
Match 1
1. (
Match 2
1. ,
Match 3
1. ,
Match 4
1. ,
Match 5
1. >
Match 6
1. +
Match 7
1. ,
Match 8
1. ,
Match 9
1. ,
Match 10
1. )
当我这样做时:
tokens = Formula.tokenize_regex.split(self.formula)
print 'tokens: ' + str(tokens)
返回:
tokens: [u'MY_FUNC', u'(', u'AVG', u',', u' WFC US EQUITY', u',', u' WFC US EQUITY', u',', u' "', u'>', u'', u'+', u'3%"', u',', u' 1', u',', u'1', u',', u'7', u')', u'']
但我需要它来排除引号中的数量,所以匹配应该是:
Match 1
1. (
Match 2
1. ,
Match 3
1. ,
Match 4
1. ,
Match 5
1. ,
Match 6
1. ,
Match 7
1. ,
Match 8
1. )
令牌应该是:
tokens: [u'MY_FUNC', u'(', u'AVG', u',', u' WFC US EQUITY', u',', u' WFC US EQUITY', u',', u'">+3%"', u',', u' 1', u',', u'1', u',', u'7', u')', u'']
【问题讨论】:
-
使用正则表达式很难确定什么是“内部”引号。您最好的选择可能是使用正则表达式在预处理步骤中连续删除引号内的所有内容,但即使这样嵌套引号也可能会造成问题。
-
在这种情况下不要尝试使用
re.split,尝试为re.findall构建一个模式,这样更简单高效。 -
如果它在嵌套引号上中断也没关系。