如何在多行中匹配行的开头和结尾

时间:2018-05-18 03:47:04

标签: python regex python-3.x

我从beautifulsoup的网站上获取了一些文字,一开始它看起来像这样:

  

9天天气预报

     

概况:在北部地区的一个反气旋高空   南海将为南方带来主要的晴朗和炎热的天气   未来几天中国沿海。在一个低谷的影响下   气压低,下周中国南部将出现阵雨   周。

     

日期/月18/5(星期五)

     风:南方力量3.

     

天气:好又热。

     

温度范围:27 - 32 C

     

R.H。范围:65 - 85%

     

日期/月19/5(星期六)

     风:南方力量3.

     

天气:好又热。

     

温度范围:27 - 32 C

     

R.H。范围:65 - 85%

我想将“日期/月”和“每分”之间的每个部分分开,这些部分跨越多行。我通过在html标签中查找一个大字符串来获取NavigableString。我尝试但是我无法通过re搜索NavigableString,所以我将字符串转换为unicode字符串:

daily_forecast_text = str(daily_forecast_text.encode('utf-8'))

它返回如下:

  

b'\ r \ n9天天气预报\ n \ n一般情况:\ n反气旋   在南中国海的北部高空飞行将主要带来   在接下来的几个中国沿海地区,天气晴朗,天气非常炎热   天。在一个低压槽的影响下,会有   下周中国南方地区的阵雨。\ n \ n日期/月18/5   (星期五)\ n风暴:南方力量2比3.天气:很好。很热的时候   那天。\ n温度范围:27 - 33 C \ nR.H。范围:60 - 85 Per   分\ n \ n日期/月19/5(星期六)\ n风向:南方力量2比3. \ n天气:   精细。白天很热。\ n温度范围:27 - 33 C \ nR.H。范围:60    - 85%/ n \ n日期/月20/5(星期日)\ n风:南方2至3日。\ n天气:很好。白天很热。\ n温度范围:28 - 33 C \ nR.H。范围:65 - 85%/ n \ n日期/月21/5(星期一)\ n风:   西南部队3. \ n天气:很好。白天很热。\ n Temp   范围:28 - 33 C \ nR.H。范围:65 - 85%/ n \ n日期/月   22/5(星期二)\ n风暴:西南部队2比3.天气:主要罚款和   很热。之后出现过阵雨。\ n温度范围:28 - 33 C \ nR.H。范围:   70 - 90%/月/月23/5(星期三)\ n风:轻风   力量2. \ n天气:晴朗的间隔和几阵雨。\ n温度范围:27    - 31 C \ nR.H。范围:70 - 95每分钟\ n \ n日期/月24/5(星期四)\ n风向:南方力量2至3. \天气:炎热,阳光充足   期间和几阵雨。\ n温度范围:27 - 32 C \ nR.H。范围:70 - 90   每分钟\ n \ n日期/月25/5(星期五)\ n风暴:南方力量3. \ n天气:   阳光充足,有一到两阵雨。\ n温度范围:27 - 32   Ç\ nR.H。范围:70 - 90%每月\ n \ n日期/月26/5(星期六)\ n风:   南力3比4.天气:炎热,阳光充足,有一两次   淋浴。\ n温度范围:27 - 32 C \ nR.H。范围:70 - 90 Per Cent \ n \ nSea   表面温度为2点17分/ 5/2018点,位于北角,为27度   C. \ n \ n在香港7点17分/ 5/2018的土壤温度   Kong \ nObservatory:\ n0.5 M以下表面为27.7摄氏度\ n1.0 M.   表面下方是26.6摄氏度。\ n \ n天气漫画为9天   天气预报\ nDay 1卡通没有。 90 - Hot \ nDay 2卡通没有。 90 -   Hot \ nDay 3卡通没有。 90 - Hot \ nDay 4卡通没有。 90 - 热门\ nDay 5   卡通没有。 90 - 热门\ nDay 6卡通没有。 54 - 阳光间隔   阵雨\ nDay 7卡通没有。 53 - 阳光明媚的时期有几阵雨\ nDay   8卡通没有。 53 - 阳光明媚的时期有几阵雨\ nDay 9卡通没有。   53 - 晴朗时期,有几阵雨\ n'

以下代码未返回任何内容:

 result = re.findall(
            "^Date.+Cent$", daily_forecast_text, flags=re.MULTILINE | re.DOTALL)

以下代码获取了所有文本,但它返回了一个以第一个“Date / Month”开头并以最后一个“Per Cent”结束的大字符串。

 result = re.findall(
                "Date.+Cent", daily_forecast_text, flags=re.MULTILINE | re.DOTALL)

2 个答案:

答案 0 :(得分:2)

带有您的文字的HTML:

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p id="weather">9-Day Weather Forecast

General Situation: An anticyclone aloft over the northern part of the South China Sea will bring mainly fine and hot weather to the south China coast in the next few days. Under the influence of a trough of low pressure, there will be showers over southern China midweek next week.

Date/Month 18/5 (Friday)

Wind: South force 3.

Weather: Fine and hot.

Temp Range: 27 - 32 C

R.H. Range: 65 - 85 Per Cent

Date/Month 19/5(Saturday)

Wind: South force 3.

Weather: Fine and hot.

Temp Range: 27 - 32 C

R.H. Range: 65 - 85 Per Cent
</p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
</body></html>
"""

获取标记

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')
tag = soup.find(id='weather')

即使tag.string是bs4 NavigableString,它也是Python str

>>> 
>>> type(tag.string)
<class 'bs4.element.NavigableString'>
>>> isinstance(tag.string, str)
True
>>> 'South force 3' in tag.string
True
>>> 

无需使用正则表达式转换为搜索

pattern = r'Date/Month.*?Per Cent'
rex = re.compile(pattern, flags = re.DOTALL)
for match in rex.findall(tag.string):
    print(match)
    print('**************')
>>>
Date/Month 18/5 (Friday)

Wind: South force 3.

Weather: Fine and hot.

Temp Range: 27 - 32 C

R.H. Range: 65 - 85 Per Cent
**************
Date/Month 19/5(Saturday)

Wind: South force 3.

Weather: Fine and hot.

Temp Range: 27 - 32 C

R.H. Range: 65 - 85 Per Cent
**************
>>> 

答案 1 :(得分:1)

.+应该是非贪婪的,在它们之后添加?

result = re.findall(
            "Date.+?Cent", daily_forecast_text, flags=re.DOTALL)