(Python)如何根据几个正则表达式检查长字符串?
我想确保一个长字符串可以同时与几个正则表达式匹配 我有一个长的多行字符串,包含文件列表和文件的一些内容(Python)如何根据几个正则表达式检查长字符串?,python,regex,Python,Regex,我想确保一个长字符串可以同时与几个正则表达式匹配 我有一个长的多行字符串,包含文件列表和文件的一些内容 DIR1\FILE1.EXT1 CONTENT11 DIR1\FILE1.EXT1 CONTENT12 DIR1\FILE1.EXT1 CONTENT13 DIR1\FILE2.EXT1 CONTENT21 DIR2\FILE3.EXT2 CONTENT31 DIR3\FILE3.EXT2 CONTENT11 该列表通常包含数十万行,有时甚至几百万行 我想检查列表是否包含预定义的文件/内容:
DIR1\FILE1.EXT1 CONTENT11
DIR1\FILE1.EXT1 CONTENT12
DIR1\FILE1.EXT1 CONTENT13
DIR1\FILE2.EXT1 CONTENT21
DIR2\FILE3.EXT2 CONTENT31
DIR3\FILE3.EXT2 CONTENT11
该列表通常包含数十万行,有时甚至几百万行
我想检查列表是否包含预定义的文件/内容:
FILE1 CONTENT11
FILE1 CONTENT12
FILE3 CONTENT11
我知道我可以通过将字符串与一些正则表达式匹配来检查字符串是否包含所有这些对
"^\S*FILE1\S*\tCONTENT11$"
"^\S*FILE1\S*\tCONTENT12$"
"^\S*FILE3\S*\tCONTENT11$"
重新导入
定义所有匹配项(str、rxs):
res=真
对于rxs中的rx:
p=重新编译(rx,re.M)
res=res和p.search(str)
返回(res)
input1=“”DIR1\\FILE1.EXT1\t内容11
DIR1\\FILE1.EXT1\t内容12
DIR1\\FILE1.EXT1\t内容13
DIR1\\FILE2.EXT1\t内容21
DIR2\\FILE3.EXT2\t内容31
目录3\\FILE3.EXT2\t内容11“”
input2=“”DIR1\\FILE1.EXT1\t内容11
DIR1\\FILE1.EXT1\t内容12
DIR1\\FILE1.EXT1\t内容13
DIR1\\FILE2.EXT1\t内容21
目录2\\FILE3.EXT2\t内容31“”
rxs=[r“^\S*文件1\S*\t内容11$”,r“^\S*文件1\S*\t内容12$”,r“^\S*文件3\S*\t内容11$”]
如果所有_匹配(输入1,rxs):
打印(“输入1匹配所有RX”)#例外
其他:
打印(“输入1不匹配所有RX”)
如果所有_匹配(input2,rxs):
打印(“input2匹配所有RX”)
其他:
打印(“input2不匹配所有RX”)#应为input2,因为input2不匹配wirh RX[2]
然而,在我的例子中,由于输入字符串很长,我宁愿避免多次启动搜索…我觉得应该可以通过这种方式更改所有匹配函数 任何帮助都将不胜感激 编辑
澄清了问题提供的示例代码您可以从您拥有的正则表达式字符串构建单个正则表达式,这将要求所有正则表达式在输入字符串中找到匹配项 生成的正则表达式如下所示
\A(?=(?:.*\n)*?\S*FILE1\S*\tCONTENT11$)(?=(?:.*\n)*?\S*FILE1\S*\tCONTENT12$)(?=(?:.*\n)*?\S*FILE3\S*\tCONTENT11$)
rxs = [r"^\S*FILE1\S*\tCONTENT11$",r"^\S*FILE1\S*\tCONTENT12$",r"^\S*FILE3\S*\tCONTENT11$"]
pat = re.compile( r"(?m)\A(?=(?:.*\n)*?{})".format(r")(?=(?:.*\n)*?".join([rx[1:] for rx in rxs])) )
def all_matching(s, pat):
return pat.search(s)
看
基本上,它将匹配:
-a(?m)
/re.m
嵌入式标志选项re.MULTILINE
-字符串的开始(不是行的开始!),下面的所有lookahead将被逐个触发,从开始检查字符串,直到其中一个失败\A
-正向前瞻,即在当前位置的右侧,需要(?=(?:..*\n)*?\S*FILE1\S*\t内容11$)
-0或更多(但尽可能少,仅当后续子模式不匹配时才会尝试该模式)(?:.*\n)*?
-0+非空白\S*
-字符串FILE1
-0+非空白\S*
-选项卡和\t内容11
子字符串内容11
-行尾(因为$
允许(?m)
匹配行尾)$
-一个与前一个类似的前瞻性操作,需要在行上使用(?=(?:..*\n)*?\S*FILE1\S*\t内容12$)
和FILE1
子字符串CONTENT12
-一个与前一个类似的前瞻操作,需要在行上使用(?=(?:..*\n)*?\S*FILE3\S*\t内容11$)
和FILE3
子字符串CONTENT11
\A(?=(?:.*\n)*?\S*FILE1\S*\tCONTENT11$)(?=(?:.*\n)*?\S*FILE1\S*\tCONTENT12$)(?=(?:.*\n)*?\S*FILE3\S*\tCONTENT11$)
rxs = [r"^\S*FILE1\S*\tCONTENT11$",r"^\S*FILE1\S*\tCONTENT12$",r"^\S*FILE3\S*\tCONTENT11$"]
pat = re.compile( r"(?m)\A(?=(?:.*\n)*?{})".format(r")(?=(?:.*\n)*?".join([rx[1:] for rx in rxs])) )
def all_matching(s, pat):
return pat.search(s)
然后,检查方法将如下所示
\A(?=(?:.*\n)*?\S*FILE1\S*\tCONTENT11$)(?=(?:.*\n)*?\S*FILE1\S*\tCONTENT12$)(?=(?:.*\n)*?\S*FILE3\S*\tCONTENT11$)
rxs = [r"^\S*FILE1\S*\tCONTENT11$",r"^\S*FILE1\S*\tCONTENT12$",r"^\S*FILE3\S*\tCONTENT11$"]
pat = re.compile( r"(?m)\A(?=(?:.*\n)*?{})".format(r")(?=(?:.*\n)*?".join([rx[1:] for rx in rxs])) )
def all_matching(s, pat):
return pat.search(s)
参见。我编辑了这个问题。我的问题不是如何分解正则表达式。问题是:你怎么能一次在几个正则表达式中检查一条文本?@wkirschenmann,你是说这个吗?谢谢你的快速回复。仍然是错误的问题。我可能还不清楚。我试图在这里用一些代码来描述我的问题:问题是,实际上,我的输入很长(数百万行),我希望避免多次运行搜索。@wkirschenmann我可以想出一个解决方案,请参阅。恐怕效率不高。@Wkirschenman将检查它是否位于字符串的开头(使用
\A
),然后尝试匹配\S*FILE1\S*\t内容11
模式,如果失败,它将获取第一个字符,然后再次尝试匹配\S*FILE1\S*\t内容11
,等等。在未能获得第一个前瞻的匹配项后,它将停止解析字符串。但是,如果第一个先行查找找到匹配项,而最后一个查找失败,则可能仍需要一些处理时间。我可以让正则表达式更有效率。