【发布时间】:2018-07-10 02:29:52
【问题描述】:
我正在定义一个正则表达式来匹配我定义的标识符 - 标识符必须以一个字母开头,后跟任意数量的字母、数字和下划线。
我有我当前的正则表达式r'[A-Za-z][A-Za-z0-9_]*',它工作得很好,除了这样的情况:如果我发送:testid@entifier_,它会返回testid 和entifier_ 的匹配项。我希望它完全拒绝标识符。部分不匹配。
它只是最终将它们分开。
如果不对合法字符使用复杂的前瞻,我该怎么办?
输入很简单:
arg = sys.argv[1]
file = open(arg)
inLines = file.read()
file.close()
tokens = lexer(inLines, tokenFormats)
我定义的正则表达式示例如下:
tokenFormats = [
(r'[\s\n\t]+', None), #Whitespace
(r'\/\*(\*(?!\/)|[^*])*\*\/', None), #Comment
(r'\(', LParent),
(r'\)', RParent),
(r'\[', LBracket),
(r'\]', RBracket),
(r'\{', LBrace),
(r'\}', RBrace),
(r'\,', CommaT),
(r'(?<="{1}).*?(?=")', STRLITERAL),
(r'\"', QuoteT),
(r'\.', PeriodT),
(r'\-?[0-9]*\.[0-9]+', ValueR),
(r'\+', AddT),
(r'-', AddT),
(r'\|\|', AddT),
(r';', Semicolon),
我的匹配循环是这样的:
def lexer(input, tokenFormats):
pos = 0
tokens = []
while pos < len(input):
match = None
for tokenFormat in tokenFormats:
pattern, tag = tokenFormat
regex = re.compile(pattern)
match = regex.match(input,pos) #Essentially Build Lexeme
if match:
lexeme = match.group(0)
if tag:
if tag == Identifier and len(str(lexeme)) > 27: #rough fix to check length. Very hacky
sys.stderr.write('Illegal length for identifier: %s\n' % lexeme)
break;
attr = checkForAttribute(lexeme,tag)
token = (lexeme,tag,attr)
tokens.append(token)
break
else:
break
if not match:
sys.stderr.write('Illegal or unknown character: %s\n' % input[pos])
pos = pos + 1
else:
pos = match.end(0)
return tokens
【问题讨论】:
-
切向,但 C 标识符也允许以
_开头。 -
啊我的错。在我的词法分析器中,我不应该接受它们。我会编辑。
-
除非您展示如何应用正则表达式,否则无法说出问题所在。
-
我添加了一些代码。
标签: python regex python-3.x