【问题标题】:Python - parsing user input using a verbose regexPython - 使用详细的正则表达式解析用户输入
【发布时间】:2015-11-24 20:23:57
【问题描述】:

我正在尝试设计一个正则表达式,以完整句子的形式解析用户输入。我正在努力让我的表达充分发挥作用。我知道它编码不好,但我正在努力学习。我目前正在尝试将它解析为代码下的一个字符串。

我的测试“句子”=How I'm 15.5% wholesome-looking U.S.A. we RADAR () [] {} you -- are, ... you?

text = input("please type somewhat coherently: ")

pattern = r'''(?x)              # set flag to allow verbose regexps
    (?:[A-Z]\.)+                # abbreviations, e.g. U.S.A.
    |\w+(?:[-']\w+)*            # permit word-internal hyphens and apostrophes
    |[-.(]+                     # double hyphen, ellipsis, and open parenthesis
    |\S\w*                       # any sequence of word characters
    # |[\d+(\.\d+)?%]           # percentages, 82%
    |[][\{\}.,;"'?():-_`]       # these are separate tokens
    '''

parsed = re.findall(pattern, text)
print(parsed)

我的输出 = ['How', "I'm", '15', '.', '5', '%', 'wholesome-looking', 'U.S.A.', 'we', 'RADAR', '(', ')', '[', ']', '{', '}', 'you', '--', 'are', ',', '...', 'you', '?']

我希望将'15', '.', '5', '%' 解析为'15.5%'。当前被注释掉的行是应该做的,但是当被注释掉时,绝对没有任何作用。我搜索了资源以提供帮助,但他们没有。

感谢您的宝贵时间。

【问题讨论】:

  • 为什么你的百分比模式包含在字符类[...]中?
  • 您已将\d.\d% 占位符放在字符类中(不重复)。此外,它可能只有在单词+连字符规则之前才会生效。
  • 谢谢,我已经修好了,学到了很多。它现在可以工作了,我只是不太了解正则表达式,并且正在尽可能快地学习。

标签: python regex


【解决方案1】:

如果您只想将百分比匹配作为一个整体实体,您确实应该知道正则表达式引擎会从左到右分析输入字符串和模式。如果你有一个替代,将选择与输入字符串匹配的最左边的替代,其余的甚至不会被测试。

因此,您需要将替代\d+(?:\.\d+)?向上拉,并将捕获组变为非捕获组,否则findall会产生奇怪的结果:

(?x)              # set flag to allow verbose regexps
(?:[A-Z]\.)+                # abbreviations, e.g. U.S.A.
|\d+(?:\.\d+)?%           # percentages, 82%  <-- PULLED UP OVER HERE
|\w+(?:[-']\w+)*            # permit word-internal hyphens and apostrophes
|[-.(]+                     # double hyphen, ellipsis, and open parenthesis
|\S\w*                       # any sequence of word characters#
|[][{}.,;"'?():_`-]       # these are separate tokens

regex demo

另外,请注意我用[][{}.,;"'?():_`-] 替换了[][\{\}.,;"'?():-_`]:大括号不必转义,- 形成了一个由冒号(十进制代码 58)和下划线(十进制 95)匹配的不必要范围;&lt;=&gt;?@,所有大写拉丁字母,[\]^

【讨论】:

    猜你喜欢
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多