Python 正则表达式匹配除“以外的所有非字母数字字符<--&引用;
我正在尝试用python创建一种玩具语言,但在创建lexer时遇到了困难。在我的语言中分配变量的方法是使用箭头("通常,编程语言的lexers会为您将要解析的语言的每种类型的标记定义正则表达式。然后,它会构建一个有限状态自动机,以字符串的形式读取输入,并在识别各种标记的状态之间转换。因此,我的方法是aken将尝试定义每个标记的外观,并尝试在您的输入中匹配这些标记。现在,老实说,我没有花太多的精力尝试为数字和标识符找到最好的正则表达式(我甚至不知道您的规则是什么)。我只想说明我认为您应该采取的方法是:Python 正则表达式匹配除“以外的所有非字母数字字符<--&引用;,python,regex,split,match,Python,Regex,Split,Match,我正在尝试用python创建一种玩具语言,但在创建lexer时遇到了困难。在我的语言中分配变量的方法是使用箭头("通常,编程语言的lexers会为您将要解析的语言的每种类型的标记定义正则表达式。然后,它会构建一个有限状态自动机,以字符串的形式读取输入,并在识别各种标记的状态之间转换。因此,我的方法是aken将尝试定义每个标记的外观,并尝试在您的输入中匹配这些标记。现在,老实说,我没有花太多的精力尝试为数字和标识符找到最好的正则表达式(我甚至不知道您的规则是什么)。我只想说明我认为您应该采取的方法
s = 'Hi <-- (1.2)'
word_list = re.findall(r'(\b\d+(?:\.\d*)?\b|\b\.\d+\b|\b\w+\b|<--|\s+|\W+)', s)
print(word_list)
各种匹配标记为OK、IGNORE(空白)或ERROR。上面的打印:
Hi
<--
Unrecognized token (
1.2
Unrecognized token )
Hi
通过稍微修改优雅的奥多代码,我设法找到了一个解决方案
split_pattern = '(<--|[\+\-\*\(\)/%:\{\},\[\]<>=(\n)(\t) ]|(?<!\d)[.](?!\d))'
word_list = re.split(split_pattern, self.source_code)
word_list = [elem for elem in word_list if (elem != '' and elem != ' ')]
split\u pattern='([item for item in self.source\u code.split()if item]
?应该怎么做“foobar@Kevin这是正确的?您可能需要单独处理表达式。可能需要按照上面的方法获得拆分后的3个部分,并使用类似于如何消除歧义的方式来处理表达式
['Hi', '<--', '1.2']
DECLARE Number: INTEGER
DECLARE Hi: REAL
Hi <-- 1.2
INPUT Number
IF Number + Hi > 3
THEN
OUTPUT "Hello"
['DECLARE', 'Number', ':', 'INTEGER','\n' 'DECLARE', 'Hi', ':', 'REAL','\n', 'Hi', '<--', '1.2','\n', 'INPUT', 'Number', '\n', '\n', 'IF', 'Number', '+', 'Hi', '>', '3','\n', '\t', 'THEN', '\n', '\t', '\t', 'OUTPUT', '"Hello"']
s = 'Hi <-- (1.2)'
word_list = re.findall(r'(\b\d+(?:\.\d*)?\b|\b\.\d+\b|\b\w+\b|<--|\s+|\W+)', s)
print(word_list)
['Hi', ' ', '<--', ' ', '(', '1.2', ')']
import re
s = 'Hi <-- (1.2)'
for m in re.finditer(r'(?P<OK>\b\d+(?:\.\d*)?\b|\b\.\d+\b|\b\w+\b|<--)|(?P<IGNORE>\s+)|(?P<ERROR>\W+)', s):
if m.group('ERROR') is not None:
print('Unrecognized token', m.group('ERROR'))
elif m.group('OK') is not None:
print(m.group('OK'))
Hi
<--
Unrecognized token (
1.2
Unrecognized token )
split_pattern = '(<--|[\+\-\*\(\)/%:\{\},\[\]<>=(\n)(\t) ]|(?<!\d)[.](?!\d))'
word_list = re.split(split_pattern, self.source_code)
word_list = [elem for elem in word_list if (elem != '' and elem != ' ')]