首页 > 解决方案 > Python:我的正则表达式在某些字符串情况下不匹配

问题描述

我尝试创建一个正则表达式,到目前为止我编写了以下代码:

(-?['0|1']{1}.[00000000e+00| ]?){1}\s(-?['0|1']{1}.[00000000e+00| ]?){1}

我的目标是检测模式({string pattern}{blank}{string pattern})

这是我的字符串模式:

'0'
'-0.'
'1.'
'-1.'
'1.00000000e+00'
'0.00000000e+00'
'-0.00000000e+00'
'-1.00000000e+00'
'0.    ' (The blanks can be at least 1 to 8 characters long.)
'-0.     ' (The blanks can be at least 1 to 8 characters long.)
'1.    ' (The blanks can be at least 1 to 8 characters long.)
'-1.   ' (The blanks can be at least 1 to 8 characters long.)

我的代码在测试用例中大多是成功的,但在某些测试用例中会出现问题。(例如,'00000000e+00' 或 ' ' 发生错误)

特别是对我来说太难了,因为至少可以有 1 到 8 个空白(' ')字符。

这是我的测试用例:

['0. 0.']
['0. 1.']
['1. 0.']
['1. 1.']
['-0. -0.']
['-0. 0.']
['0. -0.']
['1. -0.']
['1. -1.']
['-1. 1.']
['-1. -1.']
['-1.00000000e+00 0.']  # Fail
['0. -1.       ']  # Fail
['0. 0.       ']  # Fail
['-0.00000000e+00 1.00000000e+00']  # Fail
['-0.        1.00000000e+00']  # Fail

请给我一些建议。

标签: regex

解决方案


显然你有两个错误的印象。

  • 您似乎将其[ ]视为一个组构造,而它表示一个字符类。

  • 您似乎认为您必须在模式中包含分隔引号的字符串。

由于您可以将您的问题解释为您想要测试两个数字 -1、0 或 1,而其他人已经给出了正则表达式答案,因此这里有一个针对该问题的无正则表达式替代方案:

test = ['0. 0.', '0. 1.', '1. 0.', '1. 1.', '-0. -0.', '-0. 0.', '0. -0.', '1. -0.',
'1. -1.', '-1. 1.', '-1. -1.', '-1.00000000e+00 0.', '0. -1.       ', '0. 0.       ',
'-0.00000000e+00 1.00000000e+00', '-0.        1.00000000e+00', 'x y', '-1 0 1']

for t in test:
    print([t], end='\t')
    s = t.split()
    try:
        if len(s) != 2: raise ValueError
        for f in s:
            g = float(f)
            if g!=-1 and g!=0 and g!=1: raise ValueError
    except ValueError:
        print('Fail')
    else:
        print('Pass')

推荐阅读