正则表达式找不到所有必需的表达式

时间:2017-11-24 12:39:56

标签: python regex python-3.x

我正在学习python和英语。我可能采取非常业余的方法解决我的问题。 我试图在.txt文件中找到17个数字的序列。我有成千上万的文件,我一直在为我注意到的最常见的事件类型创建正则表达式,例如:

  

01582.2005.012.02.00- \ r \ n 3 \ r \ n

     

n°01387.2009.466.02.001 \ r \ n

     

n°01462。2008. 030. 02. 000 \ r \ n

     

nº0033620084610200-0\ r \ n

     <磷>氮。 02414.2008.023.02.001(201 ......

     <000> nn 00030.2007.084.02.00-3(2

     

nº00627.2009.006.02.004\ r \ n

     

nº0001491-6020125020

     

numero:00028.2009.031.02.00-0 \ r \ n

     

n 00012.2010.391.02.00-0 - 7ªtu

     

nº0000695720135020402

     

nn 00037.2007.048.02.00-1 \ r \ n

     

01113.2009.074.02.00.4。\ r

     

proc: - 00396-25.2011.5.02-0020

     

n.º0163100-53-2010.5.02.0341

     

n°01230.2007.065.02.0.0-5 - 7ªtu

     

64587.2009。\ r \ n 549.02.001 \ r \ n

我创建的正则表达式能够在大约70%的文件中找到序列,但是我得到的一点是,对于每个新的正则表达式,找到的序列数量与所得到的序列相比是微不足道的。失踪,我觉得在沙漠中计算沙子。我使用的一些正则表达式是:

search = re.search(r'((\d{5})\.?\s*(\d{4})\.?\s*(\d{3})\.?\s*(\d{2})\.?\s*(\d{2})\-?\s*(\d))', content.read())
search = re.search(r'((\d{5})\.(\d{4})\.(\d{3})\.(\d{2})\.(\d)\-(\d{2}))', content.read())
search = re.search(r'((\d{5})\.(\d{4})\.(\d{3})\.(\d{2})\.(\d{2})\.(\d))', content.read())
他们可以找到我给出的一些例子,但大多数都没有。我想知道的是我怎样才能对我的正则表达式采取更广泛的方法而不是我正在做的事情。 thankss。

编辑:我有更多要查找的问题,是那些在“ - ”或“\”

之间有换行符或空格的问题

1 个答案:

答案 0 :(得分:0)

我不确定我所看到的所有序列是否存在某些基本模式,我在regex101中使用您的输入测试了这个可能过于通用的模式,并且每个模块都有一个完全匹配这些行,在每个行中匹配17的第一个序列(其中数字可以有一些特殊字符,如它们之间的标点符号)。

(\d([\s,.\-\xAD_]|(\\r)|(\\n))*){17}

(或:(?:\d(?:[\s,.\-\xAD_]|(?:\\r)|(?:\\n))*){17}如果你想避免捕获这些组。如果你愿意,你也可以在括号之间包围整个事物以获取完整匹配。

还包括&#34; \ r&#34;和&#34; \ n&#34;从字面上写出来(\s负责处理空格和实际换行符,如果数字之间有任何换行符号),因为你已经在输入中明确写出来,所以我必须这样做才能将它们视为一部分序列。

基本上它说:匹配,连续17次:一个数字,后跟任意数量的任何这些字符或字面上的&#39; \ r&#39;或&#39; \ n&#39; 。并且你可以在正则表达式([\s,.\-\xAD_]|(\\r)|(\\n))的这一部分添加你想要考虑作为数字序列的一部分(例如,也可以忽略斜杠)的任何内容。在正则表达式的那一部分中没有任何东西会破坏或分离潜在的序列(所以我可能已经错过了字母或标点符号)

但不是超级正则表达式知识渊博,我并不是很满意,我真的认为周杰伦的建议是最好的开始:找出哪些字符只是给你带来的烦恼,删除那些来自全文,并希望在此之后更容易寻找序列。

顺便说一句,这里:

0163100-53-2010.5.02.0341

有20个数字,所以341不是完全匹配的一部分,因为它来自前17个(与其他一些行相同,连续17个数字),我不确定是否这就是你想要的。