我有一根绳子:
s = MY_FUNC(AVG, WFC US EQUITY, WFC US EQUITY, ">+3%", 1,1,7)
这个正则表达式搜索paren、逗号和简单运算符。我需要排除双引号内的任何匹配项,并能够在匹配项上拆分。请注意,解决方案仍然必须在字符串的其余部分搜索paren、逗号和运算符。 regex的当前版本是:
^{pr2}$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
的文档中有一个recipe,它将更好地为您服务。基本上,首先为每个词法类型编写一个正则表达式。例如:然后您可以使用以下内容创建主正则表达式:
^{pr2}$然后将要标记的字符串传递给
tokenizer.finditer
:现在,如果您迭代
token_iter
,您将得到一个match对象流,其中包含您可能想知道的关于字符串的所有信息(即从词法上讲)。您可能要做的是根据每个匹配对象的词法类型来处理它。对于demo,让我们打印出词法类型、匹配的字符串以及匹配字符串的位置:输出
注意:编译主正则表达式时,必须确保优先级较高的模式优先于优先级较低的模式。所以报价应该排在一切之前。由两个字符组成的运算符(如
!=
)应该在由一个字符组成的运算符之前。在此模式将处理单引号和双引号:
相关问题 更多 >
编程相关推荐