你好,我正在寻找一个正则表达式,将识别这种模式:
第一个字母总是以字符R/L/F
等开头,并且后面总是有5
数字。
我在编码正则表达式时遇到了问题,其中有一个空格或多个空格。
R20209
R4 01 08
R5 0801
此外,有时零将被识别为o
,因此R20209
将被识别为R2o2o9
。有办法解释这一点吗?
感谢编辑:谢谢zr0gravity7,我的意思是字母后面跟着"5"位数的数字而不是"4"位数的数字
仅限regex的解决方案:
^[A-Z](?:[doO] ?){4}[doO]$
这将匹配大写字母后面正好出现四次的数字(或"o"/" o"),后面尾随一个可选的空格,然后最后出现一个数字(或"o"/" o"),这次没有尾随空格。由于开始和结束锚,它匹配整个字符串。
:试试https://regex101.com/r/5kmXEe/1
若要强制第一个字符为特定的字母,可以将[A-Z]
替换为[RLF]
。
为了允许数字之间有任意数量的空格,您可以使用Kleene星号来匹配更多的空格:
^[A-Z](?:[doO] *){4}[doO]$
我认为您最好消除字符串中的空格并将o
和O
更改为0
。
import re
def fun(str):
str_formatted = str.replace(' ','').replace('o', '0').replace('O', '0')
return re.match('[RLF]d{5}', str_formatted)[0]
for i in ['R20209', 'R4 o1 08', 'R5 O8o1']:
print(fun(i))
你可以试试这个
[RLF]
-匹配R, L, f中的任意一个s*
-匹配0或多个空格。[do]
-匹配数字或字母o
。re.I
-忽略字母大小写。匹配大写和小写。
import re
s = '''R20209 R4 01 08 R5 08 01 F2 3 4 5 Af R4567 LL45 67 R 2o2o 9 R 3070 L 5 66 6 r34567 L3O45O'''
f = re.findall(r'b[RLF]s*[do]s*[do]s*[do]s*[do]s*[do]',s,re.I)
print(f)
['R20209', 'R4 01 08', 'R5 08 01', 'R 2o2o 9', 'r34567', 'L3O45O']