首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配以两个或三个数字开头的事件,但在某处不包含特定的模式。

匹配以两个或三个数字开头的事件,但在某处不包含特定的模式。
EN

Stack Overflow用户
提问于 2019-04-19 11:09:44
回答 1查看 219关注 0票数 3

我有以下几行:

代码语言:javascript
复制
 12(3)/FO.2-3;1-2
 153/G6S.3-H;2-3;1-2
 1/G13S.2-3
 22/FO.2-3;1-2
 12(3)2S/FO.2-3;1-2
 153/SH/G6S.3-H;2-3;1-2
 45/3/H/GDP6;2-3;1-2

如果在行的开头我找到了两个或三个数字,但没有找到一个,也如果字段中包含表达式FOSHGDPLDP,那么I数字就可以得到匹配。这意味着,从前面的行中只能获得153/G6S.3-H;2-3;1-2作为匹配,因为在其他行中,要么包含FOSHGDP,要么在开头只有一个数字。

我试着用

代码语言:javascript
复制
^[1-9][1-9]((?!FO|SH|GDP).)*$

我得到了正确的结果,但我不确定是正确的,我不是很擅长正则表达式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-19 11:31:16

您需要在起始数字和要排除的内容之间添加任何其他字符:

简化正则表达式:^[1-9]{2,3}(?!.*(?:FO|SH|GDP|LDP)).*$

将只与给定数据中的153/G6S.3-H;2-3;1-2匹配。

解释:

代码语言:javascript
复制
^[1-9]{2,3}(?!.*(?:FO|SH|GDP|LDP)).*$
-----------  2 to 3 digits or more at start of line  

^[1-9]{2,3}(?!.*(?:FO|SH|GDP|LDP)).*$
            --------------------- any characters + not matching (FO|SH|GDP|LDP)  

^[1-9]{2,3}(?!.*(?:FO|SH|GDP|LDP)).*$
                                  ---  match till end of line

(?:....)负查找必须严格遵循,在您不想看到的内容和您的匹配之间有其他字符,因此它没有选择它。

有关更多解释,请参见https://regex101.com/r/j4SRoQ/1 (使用{2,})。

完整代码示例:

代码语言:javascript
复制
import re

regex = r"^[1-9]{2,3}(?!.*(?:FO|SH|GDP|LDP)).*$"

test_str = r"""12(3)/FO.2-3;1-2
153/G6S.3-H;2-3;1-2
1/G13S.2-3
22/FO.2-3;1-2
12(3)2S/FO.2-3;1-2
153/SH/G6S.3-H;2-3;1-2
45/3/H/GDP6;2-3;1-2"""

matches = re.finditer(regex, test_str, re.MULTILINE)

for match in matches: 
    print(match.group()) 

输出:

代码语言:javascript
复制
153/G6S.3-H;2-3;1-2
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55760932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档