我尝试创建一个正则表达式,到目前为止,我编写了以下代码:
(-?['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].
匹配可选的-
0
或1
和.
(注意转义点((?:
交替的非捕获组|
00000000e+00| {1,8}
匹配00000000e+00
或1-8空格
)?
关闭非捕获组并将其设为可选
)
关闭组1s
匹配单个空白字符(-?[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].?
与后面跟着可选点字符的0
或1
匹配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')