我为两者制作了单独的正则表达式,但它没有给出理想的结果。它应该像检查整个输入字符串一样工作,如果有效则返回有效,如果无效则返回无效。
import re
identifiers = r'^[^\d\W]\w*\Z'
operators = r'[\+\*\-\/=]'
a = re.compile(identifiers, re.UNICODE)
b = re.compile(operators, re.UNICODE)
c = re.findall(a, 'a+b*c=d')
d = re.findall(b, 'a+b*c=d')
print c, 'identifiers'
print d, 'operators'
此代码段的结果是
[ ] identifiers &
['+', '*', '='] operators
我希望输入字符串的结果有效或无效,方法是用正则表达式检查输入字符串的所有字符
答案 0 :(得分:0)
对于像你的例子这样的简单情况,这样的表达式将起作用:
{{1}}
答案 1 :(得分:0)
我认为您使用当前代码时遇到的问题是,identifiers
模式只有在匹配整个字符串时才有效。
问题是当前模式要求输入的开头和结尾都匹配(分别由^
和\Z
匹配)。这通常会导致您找不到任何标识符,因为只有"foo"
之类的输入才会匹配,因为它是一个单独的标识符,它接触字符串的开头和结尾。 (我还注意到将^
和\Z
混合在一起有点奇怪,尽管它并非无效。将^
与{{1}配对会更自然或$
与\Z
。)
我怀疑您实际上并不想在您的模式中使用\A
和^
,而应该使用\Z
代替两者。 \b
转义符与“单词分隔符”匹配,这意味着输入的开头或结尾,或者单词字符和非单词字符之间的变化。
\b
这仍然不会按照你最终想要的那样做(测试字符串是否确保它是一个有效的表达式)。这是一项更加困难的任务,正则表达式通常不符合它。某些特定形式的表达式也许可以与正则表达式匹配,但是像括号这样的支持将会匆忙打破整个系统。要识别任意算术表达式,你需要一个更复杂的解析器,它可能在其中的一些步骤中使用正则表达式,但不是整个步骤。