【问题标题】:Python regex tokenizer for simple expression用于简单表达式的 Python 正则表达式标记器
【发布时间】:2018-05-03 12:51:56
【问题描述】:

我编写了这个正则表达式,将表达式 'res=3+x_sum*11' 拆分为词位

import re
print(re.findall('(\w+)(=)(\d+)(\*|\+)(\w+)(\*|\+)(\d+)', 'res=3+x_sum*11'))

我的输出如下所示:

[('res', '=', '3', '+', 'x_sum', '*', '11')]

但我希望 re.findall 返回一个词位及其标记的列表,以便每个词位都在自己的组中。该输出应如下所示:

[('', 'res', ''), ('', '', '='), ('3', '', ''), ('', '', '+'),

('', 'x_sum', ''), ('', '', '*'), ('11', '', '')] 

我如何让 re.findall 返回这样的输出

【问题讨论】:

    标签: python regex python-3.x


    【解决方案1】:

    您可以使用标记字符串

    re.findall(r'(\d+)|([^\W\d]+)|(\W)', s)
    

    请参阅regex demo。请注意,一旦模式包含多个捕获组,re.findall 就会返回一个元组列表。上面的模式包含 3 个捕获组,因此,每个元组包含 3 个元素:1+ 数字、1+ 字母/下划线或非单词字符。

    更多详情

    • (\d+) - 捕获组 1:1+ 位
    • | - 或
    • ([^\W\d]+) - 捕获组 2:1+ 非单词和数字字符(字母或下划线)以外的字符
    • | - 或
    • (\W) - 捕获组 3:非单词字符。

    Python demo:

    import re
    rx = r"(\d+)|([^\W\d]+)|(\W)"
    s = "res=3+x_sum*11"
    print(re.findall(rx, s))
    # => [('', 'res', ''), ('', '', '='), ('3', '', ''), ('', '', '+'), ('', 'x_sum', ''), ('', '', '*'), ('11', '', '')]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      相关资源
      最近更新 更多