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

请给我一些建议。

您可以使用

(-?[01].(?:00000000e+00| {1,8})?)s(-?[01].(?:00000000e+00| {1,8})?)

模式匹配:

  • (捕获组1
    • -?[01].匹配可选的-01.(注意转义点(
    • (?:交替的非捕获组|
      • 00000000e+00| {1,8}匹配00000000e+00或1-8空格
    • )?关闭非捕获组并将其设为可选
  • )关闭组1
  • s匹配单个空白字符
  • (-?[01].(?:00000000e+00| {1,8})?)捕获组2,与捕获组1模式相同

Regex演示

请注意,s也可以匹配换行符,如果您只想匹配,则可以省略捕获组。


没有标记语言,但如果支持,您可以缩短模式,递归第一个子模式,因为该模式使用同一部分两次。

(-?[01].(?:0{8}e+00| {1,8})?)s(?1)

Regex演示

请尝试以下操作:

import re
l = ['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']
for s in l:
if re.match(r'-?[0|1].?(?:0{8}e+00|s{1,8})?s-?[0|1].?(?:0{8}e+00|s{1,8})?$', s):
print("match")
else:
print("no match")

正则表达式-?[0|1].?(?:0{8}e+00|s{1,8})?:的解释

  • -?匹配长度为0或1的短划线字符
  • [0|1].?与后面跟着可选点字符的01匹配
  • 0{8}e+00匹配子字符串00000000e+00
  • s{1,8}匹配长度在1和8之间的空白
  • (?:0{8}e+00|s{1,8})?与上面两个正则表达式中的任何一个匹配或不匹配

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

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

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

由于可以将您的问题解释为您想要测试-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')

最新更新