如何使用findall打印正则表达式的结果?

时间:2016-12-02 22:34:42

标签: python regex parsing

有点新的Python正则表达式,我试图解析下面的数据。

代码

thing = soup.find_all('div', {'class' : 'matchheader'})
thing1 = str(thing)
print(thing1)

给我

  1. GSL - <b>Global Ship Lease Inc</b> [N/A] - Matched DCIX from 07/27/16 to 12/01/16
  </div>, <div class="matchheader">
  2. SBGI - <b>Sinclair Broadcast Group, Inc.</b> [Media] - Matched DCIX from 07/27/16 to 12/01/16
  </div>, <div class="matchheader">
  3. WSTC - <b>West Corporation</b> [+2] - Matched DCIX from 07/27/16 to 12/01/16
  </div>, <div class="matchheader">
  4. TGNA - <b>TEGNA Inc.</b> [N/A] - Matched DCIX from 07/27/16 to 12/01/16
  </div>, <div class="matchheader">
  5. MLI - <b>MUELLER INDUSTRIES INC</b> [Manufacturing] - Matched DCIX from 07/27/16 to 12/01/16

现在正则表达式

pattern = "([A-Z])[A-Z]{2,5}(?![A-Z])"
match = re.findall(pattern,thing1)
print(match)

我期待的结果是

['GSL', 'SBGI', 'WSTC', 'TGNA', 'MLI']

但我得到的结果是

['G', 'D', 'S', 'D', 'W', 'D', 'T', 'T', 'D', 'M', 'U', 'S', 'I', 'D']

我很确定第二个D来自第一行的DCIX。

我正在使用的正则表达式,使用 re.findall ,还是打印(匹配)

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

您的正则表达式将匹配每组连续的大写字母,然后只返回每个组的第一个字母。相反,您可能只想返回每行中的第一个组。

您可以做的是使用前缀^.*?([A-Z]{2,5})来查找行^.*?开头的最短序列(使用re.M进行多行模式),然后是一组大写字母([A-Z]{2,5}),如果有的话,然后返回该组。

>>> re.findall("^.*?([A-Z]{2,5})", thing1, re.M)
['GSL', 'SBGI', 'WSTC', 'TGNA', 'MLI']

答案 1 :(得分:0)

如果是包装文本,或者为了确保我们得到第二行元素(如果类名为空),我建议检查行开头的数字是否存在,并使用以下正则表达式:

r"^[0-9]+[^\w]+([A-Z]{2,5})"

答案 2 :(得分:0)

我完全不确定,但也许你想要的是汤。文字?即:

for item in thing:
    thing1=item.text
    print(thing1)

但是,我会这样做:

thing=soup.select('div.matchheader') #returns a list of divs that have a css class 'matchheader'
thing1_list=[]
for item in thing:
    thing1_list.append(item.getText())

希望有所帮助