Python - 使用详细的正则表达式解析用户输入

时间:2015-08-30 19:42:00

标签: python regex

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

我的测试"句子" = 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%'。当前注释掉的那一行是应该做什么的,但是当评论时绝对没有。我寻找资源来帮助,但他们没有。

谢谢你的时间。

1 个答案:

答案 0 :(得分: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)匹配;<=>?@,所有大写拉丁字母,{{ 1}},[\]