【问题标题】:How do I check if a string matches a set pattern in Python?如何检查字符串是否与 Python 中的设置模式匹配?
【发布时间】:2017-07-25 02:11:11
【问题描述】:

我想将一个字符串匹配到一个特定的模式或一组单词,如下所示:

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

如果还没有图书馆可以做到这一点,那么最好的方法是什么?如果这可以用简单的正则表达式来完成,那就太好了;但是我对正则表达式几乎一无所知。我正在使用 Python 2.7.11

【问题讨论】:

    标签: python string pattern-matching


    【解决方案1】:
    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)

    【讨论】:

    • 好的,所以我可以使用它,如果它不返回 None 它是真的。
    • if re.search(r"sleep (mode|computer)", speech.lower()) is not None: 是的,它奏效了。谢谢!
    【解决方案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(也是包名)。

    该包包含许多有用的自定义参数类型。 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,其中也讨论了这些包。

    【讨论】:

      猜你喜欢
      • 2010-12-19
      • 2016-10-03
      • 2011-03-28
      • 2012-09-17
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      相关资源
      最近更新 更多