2016-12-09 148 views
-3

我有很多的文件名与模式SURENAME__notalwaysmiddlename_firstnames_1230123Abc123-16x_notalways.pdf,如:正则表达式来蟒蛇正则表达式

  • SMITH_John_001322Cde444-16v_HA.pdf
  • FLORRICK-DOILE_Debora_Alicia_321333Gef213-16p.pdf
  • ROBINSON-SMITH_Maria-Louise_321333Gef213-16p_GH.pdf

我的老正则表达式是([\w]*)_([\w-\w]+)\.\w+但之后切换到Python并获得第一个双管姓(甚至是名字),我无法让它运行。

随着旧的正则表达式我有两个群体:

  1. SMITH_James
  2. 001322Cde444-16v_HA

但现在我不知道如何与re实现这一目标,甚至包括偶尔的双管组1中的名称和组2中的ID。

+1

前右找到逃跑期间字发布你正在使用的代码,所以我们可以帮助你:) –

+2

我建议使用eg https://regex101.com/#python来开发正则表达式。它给你解释你的模式和目前匹配的视觉演示。 – jonrsharpe

+0

真的,'[\ w- \ w]'?这个“范围”的目的是什么?试试['(\ w *)_([\ w-] +)\。\ w +'](https://regex101.com/r/4mEALO/1)。但是,我不确定输出应该是什么。如果你使用're.findall',它将只返回一个元组列表。使用're.finditer'获取所有匹配对象以访问任何匹配数据。 –

回答

1

([A-Z-]+)(?:_([A-z-]+))?_([A-z-]+)_(\d.*)\.

此模式将返回姓氏,潜在中间名,名字和最终字符串。

  • ([A-Z-]+)返回一个大写的词,还可以含有-
  • (?:_([A-z-]+))?返回0或通过_前面有一个字的1个匹配。该(?:使得_非捕获
  • ([A-z-]+)回报也可以包含-
  • (\d.*)返回以数字
  • \.开头的字符串的文件类型
+1

正则表达式的答案更有用,如果你包含他们如何工作的解释。 – skrrgwasme