【问题标题】:How to split operator and operands in python如何在python中拆分运算符和操作数
【发布时间】:2015-09-30 18:41:24
【问题描述】:

我的运营商是:=>=<=><
而我的表达方式很简单,如下示例:

string1 = string2
string1=string2
string1= string2
string1 =string2
string1>=string2
string1 >=string2
string1 >= string2
string1 <string2
...

我需要将上述任何表达式拆分为三个单词,并获得一个包含运算符和操作数的列表。例如

['string1', '>=', 'string2']

我尝试使用re.split,但没有得到合适的结果。任何建议将不胜感激。

【问题讨论】:

    标签: python regex python-2.7 split


    【解决方案1】:

    你可以试试:

    re.split('(\W+)', 'string1 >=string2')
    

    请注意,用括号括起来 \W+ 将保留您要根据的文字。

    如果您想具体化并仅拆分给给定的字符串,您可以列出它们并构建一个正则表达式,| 将每个字符串分开。

    【讨论】:

    • 谢谢。它返回['string1', ' &gt;=', 'string2']。是否有可能得到['string1', '&gt;=', 'string2'](修剪过的字)?
    • @Meysam [x.strip(' ') for x in re.split...]
    • @Meysam 或者你可以使用map(str.strip, re.split('(\W+)', 'string1 &gt;=string2'))
    • 您能否详细说明答案的最后一部分?
    • @Meysam | 在正则表达式中的意思是“或”,所以如果你想根据&gt;==&gt; 进行拆分,你只需写&gt;=|=|&gt;。所以一般来说,你可以|.join(list_of_regexes),这将仅限于你提到的用例。
    【解决方案2】:

    这是提取数据的代码,您可以根据需要将找到的元素放入列表中:

    import re
    lst = ['string1 = string2',
        'string1=string2',
        'string1= string2',
        'string1 =string2',
        'string1>=string2',
        'string1 >=string2',
        'string1 >= string2',
        'string1 <string2']
    pat = re.compile(r'(\w+)\s*([<>=]{1,2})\s*(\w+)')
    for e in lst :
        matches = pat.search(e)
        print matches.group(1), matches.group(2), matches.group(3)
    

    输出:

    string1 = string2
    string1 = string2
    string1 = string2
    string1 = string2
    string1 >= string2
    string1 >= string2
    string1 >= string2
    string1 < string2
    

    【讨论】:

    • 您的正则表达式还将匹配包含非法运算符的string1 &lt;&lt; string2string1 &lt;&gt; string2
    • 这更严格:pat = re.compile(r'(\w+)\s*(=|&lt;=|&gt;=|&lt;|&gt;)\s*(\w+)')
    • 感谢两位cmets。我假设输入数据是有效的。无论如何,正则表达式越严格越好。
    【解决方案3】:

    您可以使用re.findall

    >>> import re
    >>> s = "string1>=string2"
    >>> re.findall(r'\w+|[^\s\w]+', s)
    ['string1', '>=', 'string2']
    >>> re.findall(r'\w+|[^\s\w]+', 'string1 = string2')
    ['string1', '=', 'string2']
    >>> re.findall(r'\w+|[^\s\w]+', 'string1 >= string2')
    ['string1', '>=', 'string2']
    >>> re.findall(r'\w+|[^\s\w]+', 'string1 <string2')
    ['string1', '<', 'string2']
    

    【讨论】:

      【解决方案4】:

      您可以在 python 中使用此表达式来分隔数字运算符和操作数。如果你想在字符串上使用,你可能需要稍微编辑一下,但如果你知道规则并通过stackoverflow中的一些示例,这将很容易。

      numlst = re.findall("[0-9]+|\+|\-|\*|\/|\(|\)",eqn)
      

      【讨论】:

        猜你喜欢
        • 2017-10-14
        • 2013-08-30
        • 1970-01-01
        • 2014-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-25
        相关资源
        最近更新 更多