【问题标题】:Regular expression in python to capture first operatorpython中的正则表达式捕获第一个运算符
【发布时间】:2013-03-18 17:29:15
【问题描述】:

我正在尝试解析以下模式:

name1 运营商名称2

其中“运算符”是 &、^ 或 | 之一

群组应该是(name1 operator name2,name1,operator,name2)

现在,任一名称还可以包含&,| or ^ 和空格,但只有第一次出现才会使操作符。进一步出现将被视为 name2 的一部分。

我已经为此苦苦挣扎了很长一段时间了,我有

\s*(\w+\s*\w*)\s*([&|^])\s*(\w+\s*\&*\w+)

似乎不是很锋利,也不起作用。另外,如果有一个类似于str.partition() 的函数可以使用正则表达式并将结果限制为1,那就太好了。我找不到。

关于正则表达式或函数的任何想法?谢谢

【问题讨论】:

    标签: python regex


    【解决方案1】:
    In [163]: re.split(r'\s*([&|^])\s*', 'name1|name2', maxsplit=1)
    Out[163]: ['name1', '|', 'name2']
    

    maxsplit=1 导致 re.split 最多匹配 1 个:

    In [164]: re.split(r'\s*([&|^])\s*', 'name1|nam^e2', maxsplit=1)
    Out[164]: ['name1', '|', 'nam^e2']
    

    您也可以使用非贪婪搜索:

    In [184]: re.search(r'\s*(.*?)\s*([&|^])\s*(.*?)\s*', 'name1 | nam^e2').groups()
    Out[184]: ('name1', '|', 'nam^e2')
    

    这样做的好处是还能去掉字符串开头和结尾的空格。

    第一组的非贪婪,(.*?) 允许([&|^]) 匹配&|^ 的第一次出现。

    【讨论】:

    • 很好,我们同时编写了几乎相同的正则表达式,但我使用了.+?,所以它不会匹配单独的|foo&
    【解决方案2】:

    删除多余空格的选项:

    >>> re.search(r'^\s*(.+?)\s*([&|^])\s*(.+?)\s*$', ' foo | bar & lol ').groups()
    ('foo', '|', 'bar & lol')
    

    【讨论】:

      猜你喜欢
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多