Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式匹配除“以外的所有非字母数字字符<--&引用;_Python_Regex_Split_Match - Fatal编程技术网

Python 正则表达式匹配除“以外的所有非字母数字字符<--&引用;

Python 正则表达式匹配除“以外的所有非字母数字字符<--&引用;,python,regex,split,match,Python,Regex,Split,Match,我正在尝试用python创建一种玩具语言,但在创建lexer时遇到了困难。在我的语言中分配变量的方法是使用箭头("通常,编程语言的lexers会为您将要解析的语言的每种类型的标记定义正则表达式。然后,它会构建一个有限状态自动机,以字符串的形式读取输入,并在识别各种标记的状态之间转换。因此,我的方法是aken将尝试定义每个标记的外观,并尝试在您的输入中匹配这些标记。现在,老实说,我没有花太多的精力尝试为数字和标识符找到最好的正则表达式(我甚至不知道您的规则是什么)。我只想说明我认为您应该采取的方法

我正在尝试用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 != ' ')]