代码之家  ›  专栏  ›  技术社区  ›  Leoli

python-普通快递,无订单

  •  1
  • Leoli  · 技术社区  · 8 年前

    我想从一个句子中提取2个实体。如:

    str1='我是汤姆,我有车'

    如果有的话,我想把“汤姆”或“杰克”这个词提取出来作为名字。

    我还想将单词“car”或“bike”提取为属性(如果存在)

    现在我可以简单地写两个正则表达式:

    re.search(r"(?P<name>tom|jack)", s).group('name')
    re.search(r"(?P<property>car|bike)", s).group('property')
    

    但我想知道我是否能把这两者结合起来。

    问题是我不知道名称和属性的顺序。所以下面的代码

    re.search(r"(?P<name>tom|jim).*(?P<property>car|bike)", s)
    

    不适用于:

    ‘str2=我有车,我是汤姆’

    我试图简单地结合两种订单情况

    re.search(r"(((?P<name>tom|jack).*(?P<property>car|bike))|((?P<property>car|bike).*(?P<name>tom|jack)))", s2)
    

    除非我改为

    re.search(r"(((?P<name>tom|jack).*(?P<property>car|bike))|((?P<property2>car|bike).*(?P<name2>tom|jack)))", s2)
    

    问题

    我如何写一个普通快车提取汤姆/杰克的名字和汽车/自行车作为财产,而不考虑订单?

    而且

    我不想简单地列出所有可能的订单,因为如果我想提取n种实体,可能会出现太多的情况。

    1 回复  |  直到 8 年前
        1
  •  0
  •   revo shanwije    8 年前

    是的,这是可能的,但在查找范围内,否则字符会被消耗掉,引擎指针也不需要返回以进行新的查找。

    \A(?=.*(?P<name>tom|jack))(?=.*(?P<property>car|bike))
    

    Live demo

    regex中的每个模式都应该匹配以引导成功匹配。如果它们不是强制模式,则使它们成为可选的。