如何检查字符串是否与Python中的设置模式匹配?

时间:2017-07-25 02:11:12

标签: python string pattern-matching

我想将字符串与特定模式或单词集匹配,如下所示:

the apple is red是查询和 the apple|orange|grape is red|orange|violet是要匹配的模式。 管道将代表相互替代的单词。该模式也可以分组为[launch app]|[start program]。我希望模块返回True或False,无论查询是否与模式匹配,当然。

如果没有可以执行此操作的库,那么实现此目的的最佳方法是什么?如果这可以用简单的正则表达式完成,那就太好了;但我对正则表达式几乎一无所知。我使用的是Python 2.7.11

2 个答案:

答案 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.Formatterparse.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,其中也讨论了这些包。