我有一个正则表达式,可以让我按照以下模式查找子字符串:12345/123
:'\d{5}/\d{3}'
。
我还想找到遵循相同模式但空格可以在任何地方(开头和结尾除外)的子字符串。这是所有可能性:
1 2345/123
12 345/123
123 45/123
1234 5/123
12345 /123
12345/ 123
12345/1 23
12345/12 3
是否有一种简单的方法来使用唯一的正则表达式?
我目前对每种可能性都有一个正则表达式('\d\s\d{4}/\d{3}'
,'\d{2}\s\d{3}/\d{3}'
...),但这不是一个好习惯。
示例:
我拥有的字符串:
'THIS IS 50325/654 A TEST STRING 56 968/325 THIS IS A 65646 TEST 46546/ 564 STRING THIS 259 65/456 IS A TEST 54654/65 4 STRING'
我想获得的比赛:['50325/654', '46546/ 564', '259 65/456', '54654/65 4']
编辑: 一些更多信息:
答案 0 :(得分:1)
您可以尝试使用“ |”或在多种条件下运行正则表达式
re.findall('\d{2,} \d{2,}/\d{3,} | \d{2,}/\d{3,} | \d{2,}/\d{1,} \d{1,}',a)
outL
[' 50325/654 ', '56 968/325 ', '259 65/456 ', ' 54654/65 4']
答案 1 :(得分:0)
一种解决方案是删除每个空格,然后运行正则表达式。
import re
s='THIS IS 50325/654 A TEST STRING 56 968/325 THIS IS A 65646 TEST 46546/ 564 STRING THIS 259 65/456 IS A TEST 54654/65 4 STRING'
t=s.replace(' ','')
print(re.findall('\d{5}/\d{3}',t))
#['50325/654', '56968/325', '46546/564', '25965/456', '54654/654']
我相信通过修改,如果将正则表达式修改为(?:\D)\d{5}/\d{3}(?!\d)
,只会得到开头或结尾没有多余数字的模式。
答案 2 :(得分:0)
我认为以下内容将很好地满足您的需求。
\ d(((\ d | \ s){5})/(\ d {3})|(\ d {5} /(\ d | \ s){4})
因此它要么捕获一个数字,然后捕获另外五个为空格或数字的字符,然后捕获/,然后捕获三个数位,或者捕获五个数字,然后捕获/,然后捕获四个字符,即空格或数字
设计正则表达式真的很困难,因为没有手头的数据可以查看和检查,因为我不确定我的正则表达式是否可以100%地工作。
此外,我对您进行了测试,我的正则表达式还捕获了您要捕获的其他内容之上的56 968/325,我不确定您是否要这样做,但是在您的原始可能性列表中,具有非常相似的外观值12 345/123,所以我以为您误会并忘记了它。
答案 3 :(得分:0)
这有点作弊,因为我使用带正则表达式的正则表达式来验证格式
digit{5}/digit{3}
,然后验证/
的左侧和右侧最多有一个空格,然后匹配任意数量的数字和空格:
\b(?:(?:(?=[\d\s]{6})(?=\d*\s\d*\/\d{3}\b))(\d*\s*\d*)\/(\d{3})|(?:\d{5}\/(?=[\d\s]{4}\b)(\d*\s*\d*)))\b
对不起,这比简单地枚举所有位置的空格要好得多。
编辑:修复了正则表达式更简单的问题,并允许对示例字符串进行浮动匹配。