我尝试设计一个正则表达式,将以完整句子的形式解析用户输入。我正在努力让我的表达充分发挥作用。我知道它编码不好,但我正在努力学习。我目前正试图让它解析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%'
。当前注释掉的那一行是应该做什么的,但是当评论时绝对没有。我寻找资源来帮助,但他们没有。
谢谢你的时间。
答案 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}},[
,\
和]
。