2015-08-13 34 views
-1

我试图捕获多个组忽略情况,并且暂时没有任何进展。 我正在检查该字符串可以有多种形式,一些例如python正则表达式多个可选捕获组

<A title="Test title Ch.42" href="http://www.google.com">Test title Ch.42 </a> 
<A title="Test title Vol2. Ch.42" href="http://www.google.com">Test title Vol2. Ch.42 </a> 
<A title="Test title Vol2.Ch.42" href="http://www.google.com">Test title Vol2.Ch.42 </a> 
<A title="Test title \"with multiple quotes\" Ch.42" href="http://www.google.com">Test title "with multiple quotes" Ch.42 </a> 
<A title="Test title w1th numb3rs Ch.42" href="http://www.google.com">Test title w1th numb3rs Ch.42 </a> 
<A title="Test title no 42" href="http://www.google.com">Test title no 42 </a> 

所以一般的规则是这样的:

  • 在标题标签的主标题可以包含每一个字符包括数字和特殊字符

  • 的URL是一个标准的URL,而可以是与(。*)表达捕获毫无问题

  • The Ch。通常是可选的

  • 如果字符串包含Vol。,Ch。获得强制性

我现在的正则表达式如下:

pattern = re.compile('<A title="((.*)(?:Vol.[\d]+){0,1}(?: Ch.){0,1}([\d]+))" href="(.*)">') 

我想尝试和捕捉:

  • 与卷和章节,包括其背后的号码标题标签

  • 没有Vol和Ch的标题(没有Vol和C后面的数字) h)

  • Ch。

它会更好分裂正则表达式,这将是为更好的性能(它运行在几千字符串,所以我想保持它的高性能)?

亲切的问候Baumchen

回答

0

正则表达式是不是在这种情况下,分析的最佳工具,我想有工具恰好为。然而,随着给定的例子,你可以试试这个:

<a title="(.+?)\s?((Vol(\d+))?\s?\.?(Ch.(\d+)))?"\shref="(.+)"> 

DEMO

  • group(1) - 标题,
  • group(2) - 卷与NUM或/与章与NUM,
  • group(3) - 卷带号码
  • group(4) - 只有号码(Vol)
  • group(5) - 中国与数
  • group(6) - 只有
  • group(7)(的CH)数 - URL
+0

非常感谢完美的工作,你会推荐什么样的工具对于这种情况? – Baumchen

+0

@Baumchen我很高兴它有帮助。我没有Python背景,但我认为任何html解析器都可以处理它,在leas partialy(也许[this one])(https://docs.python.org/2/library/htmlparser.html)) –