我想将字符串与特定模式或单词集匹配,如下所示:
the apple is red
是查询和
the apple|orange|grape is red|orange|violet
是要匹配的模式。
管道将代表相互替代的单词。该模式也可以分组为[launch app]|[start program]
。我希望模块返回True或False,无论查询是否与模式匹配,当然。
如果没有可以执行此操作的库,那么实现此目的的最佳方法是什么?如果这可以用简单的正则表达式完成,那就太好了;但我对正则表达式几乎一无所知。我使用的是Python 2.7.11
答案 0 :(得分:5)
如果这正确回答了你的问题,请告诉我。
import re
string = 'the apple is red'
re.search(r'^the (apple|orange|grape) is (red|orange|violet)', string)
以下是它运行的一个例子:
In [20]: re.search(r'^the (apple|orange|grape) is (red|orange|violet)', string). groups()
Out[20]: ('apple', 'red')
如果没有匹配,则re.search()
将不返回任何内容。
你可能知道“正则表达式几乎没有”,但你差不多写了这个模式。
括号内的部分也可以有自己的正则表达式。所以你可以将“apple”和“apples”与
匹配 r'the (apple[s]*|orange|grape)
答案 1 :(得分:2)
针对此类问题的基于re
的解决方案效果很好。但是如果有一种简单的方法可以在Python中从数据库中提取数据而不必学习正则表达式(或者重新学习它,这是我自己的大脑被打破后最终必须做的事情)。
谢天谢地,someone花时间写parse
。
parse
parse
is a nice package对于这种事情。它使用正则表达式,但API基于string
format specification mini-language,大多数Python用户已经熟悉它。
对于您将反复使用的格式规范,您将使用parse.compile
。这是一个例子:
>>> import parse
>>> theaisb_parser = parse.compile('the {} is {}')
>>> fruit, color = theaisb_parser.parse('the apple is red')
>>> print(fruit, color)
apple red
parmatter
我have put a package I created for my own use on pypi 以防其他人认为有用。它让事情变得更好一些。它大量使用parse
。我的想法是将the functionality of a string.Formatter
和parse.Parser
合并到一个对象中,我将其称为parmatter
(也是包名称)。
该软件包包含许多有用的自定义parmatter类型。 StaticParmatter
具有预编译的解析规范(类似于上面parse.compile
的对象)。像这样使用它:
>>> from parmatter import StaticParmatter
>>> theaisb = StaticParmatter('the {} is {}')
>>> print(theaisb.format('lizard', 'chartreuse'))
the lizard is chartreuse
>>> fruit, color = theaisb.unformat('the homynym is ogive')
>>> print(fruit, color)
homynym ogive
请注意,对于“取消格式化”,parse
包使用方法名称parse
。但是,我的包使用unformat
。这样做的原因是parmatter
类是string.Formatter
的子类,而string.Formatter
已经有.parse()
方法(提供不同的功能)。另外,我认为unformat
无论如何都是一个更直观的方法名称。
编辑:另请参阅我的previous answer to another question,其中也讨论了这些包。