2017-07-01 107 views
-1

我有以下字符串:如何从html文本中捕获两个子字符串?

data-event-title="Yuichi Sugita* vs Adrian Mannarino"> 
           <span class="odds-container"> 
                  <b class="odds">1/12</b> 
                    </a> 

而且我想捕捉Yuichi Sugita1/12。为此,我创建了以下正则表达式: ata-event-title="(.+)".+ class="odds">(.+)< 其中括号中有两个捕获组(当我单独使用它们时它们工作正常),但问题在于它们之间的.+未按预期工作。

任何建议表示赞赏。

+1

它,因为你应该使用的东西比正则表达式这个工作,其他“不能按预期工作。” – horcrux

+0

喜欢什么?为什么? – Nickpick

+1

就像一个HTML解析器。 [这就是为什么](https://stackoverflow.com/a/1732454/4607733)! – horcrux

回答

1

您在使用点的是“贪婪”,所以他们抓住尽可能他们可能可以(和你不在这种情况下实际上并不希望这样)。

您可以将捕获组量化符更改为“懒惰”,但对捕获组使用否定字符类(语法[^character])会更有效。

的点你的两个拍摄组之间是罚款是“贪婪”,因为当它遇到class="odds">无论如何会被暂停。

假设你有换行作为样本输入显示,您的点会停止换行符,除非您使用s标志使用图案。使用此:

r"data-event-title=\"([^*]+).*class=\"odds\">([^<]+)"s 

这将捕获:

  1. 遵循data-event-title="只是*第一次出现之前结束的子字符串。
  2. 跟随class="odds">第一<之前刚刚结束的子被发现。

这是Python regex pattern demo


如果你想充分data-event-title属性值,这将捕获Yuichi Sugita* vs Adrian Mannarino

r"data-event-title=\"([^\"]+).*class=\"odds\">([^<]+)"s 
1

如果你想捕捉里面data-event-title=""1/12文本,然后使用正则表达式
data\-event\-title\=\"(.+?)\"[^\0]*class\=\"odds\".*\>(.+?)\<
https://regex101.com/r/4loeLv/1

或者

如果你想捕捉第一人的名字里data-event-title=""然后
data\-event\-title\=\"(.+?) vs.*?\"[^\0]*class\=\"odds\".*\>(.+?)\<
https://regex101.com/r/4loeLv/2

+0

为什么我需要把'[^ \ 0] *'? – Nickpick

+0

在给定的文本中有很多不同的字符,这可以是除null = \ 0之外的任何东西(包括'\ s','\ t','\ n','\ r')。 – lkdhruw

0

我用替代垂直条管道符号(|)。 read more here

此正则表达式你想要做什么:

>(.*)<|data-event-title="([^*]*.).*" 

看到这里保存的正则表达式regex101

相关问题