如何使用正则表达式从字符串中提取子字符串

How to extract a substring from a string using regex

我有一个像下面这样的字符串 如果可能的话,我想使用正则表达式或任何其他方式从此字符串中提取突出显示的部分

Milwaukee/Sullivan 的国家气象局已发布 a\n\n* Tornado Warning for...\nNorthwestern Columbia County in south central Wisconsin...\nSouthwestern Marquette County in south central Wisconsin...\n\n* 直到晚上 945 点 CDT。\n\n* 晚上 911 点 CDT,一场强烈的雷暴能够在威斯康星戴尔以东 8 英里处产生 tornado\nwas,并向东北移动 45\nmph。\n\nHAZARD...Tornado.\n\nSOURCE.. .雷达指示旋转。\n\nIMPACT...飞行的碎片对那些被捕获的人来说是危险的without\nshelter。移动房屋将被损坏或毁坏。\n屋顶、windows 和车辆将会损坏。 Tree\ndamage 很有可能。\n\n* 受影响的地点包括...\nPackwaukee、Endeavor 和 Briggsville。

description = 'The National Weather Service in Milwaukee/Sullivan has issued a\n\n* Tornado Warning for...\nNorthwestern Columbia County in south central Wisconsin...\nSouthwestern Marquette County in south central Wisconsin...\n\n* Until 945 PM CDT.\n\n* At 911 PM CDT, a severe thunderstorm capable of producing a tornado\nwas located 8 miles east of Wisconsin Dells, moving northeast at 45\nmph.\n\nHAZARD...Tornado.\n\nSOURCE...Radar indicated rotation.\n\nIMPACT...Flying debris will be dangerous to those caught without\nshelter. Mobile homes will be damaged or destroyed.\nDamage to roofs, windows, and vehicles will occur.  Tree\ndamage is likely.\n\n* Locations impacted include...\nPackwaukee, Endeavor and Briggsville.'

#now I want to match substring between (Tornado Warning for... *** ...\n\n*)

# I tried to like this

re.search('Tornado Warning for...(.*)\n\n*', description)

# I am getting results like this

<re.Match object; span=(67, 90), match='Tornado Warning for...\n'>

#expected result 

<re.Match object; span=(any, any), match='Tornado Warning for...\nNorthwestern Columbia County in south central Wisconsin...\nSouthwestern Marquette County in south central Wisconsin...\n\n*'>

它不匹配完​​整的子字符串它唯一的匹配 Tornado Warning for...\n

我要配对 Tornado Warning for...\nNorthwestern Columbia County in south central Wisconsin...\nSouthwestern Marquette County in south central Wisconsin...\n\n*

其中子串开始 Tornado Warning for... 结束 \n\n*

感谢您的帮助,抱歉我的英语不好

你可以匹配

\bTornado Warning for\.\.\.(?:\n.*)*?\n\n

模式匹配:

  • \bTornado Warning for\.\.\. 匹配前面有单词边界的 Tornado Warning for 并转义点以按字面意思匹配它们
  • (?:\n.*)*? 尽可能少地匹配一个换行符和该行的其余部分
  • \n\n 匹配 2 个换行符

Regex demo | Python demo

例如

import re

description = 'The National Weather Service in Milwaukee/Sullivan has issued a\n\n* Tornado Warning for...\nNorthwestern Columbia County in south central Wisconsin...\nSouthwestern Marquette County in south central Wisconsin...\n\n* Until 945 PM CDT.\n\n* At 911 PM CDT, a severe thunderstorm capable of producing a tornado\nwas located 8 miles east of Wisconsin Dells, moving northeast at 45\nmph.\n\nHAZARD...Tornado.\n\nSOURCE...Radar indicated rotation.\n\nIMPACT...Flying debris will be dangerous to those caught without\nshelter. Mobile homes will be damaged or destroyed.\nDamage to roofs, windows, and vehicles will occur.  Tree\ndamage is likely.\n\n* Locations impacted include...\nPackwaukee, Endeavor and Briggsville.'

m = re.search(r'\bTornado Warning for\.\.\.(?:\n.*)*?\n\n', description)
if m:
    print(m.group())

输出

Tornado Warning for...
Northwestern Columbia County in south central Wisconsin...
Southwestern Marquette County in south central Wisconsin...

正则表达式可能如下所示:

matched_string = re.findall("Tornado[a-zA-Z\s\.\\*]+\n\n\*", description)
print(matched_string)

. 无法匹配 \n。使用 [\W\w] 代替 .

import re
description = 'The National Weather Service in Milwaukee/Sullivan has issued a\n\n* Tornado Warning for...\nNorthwestern Columbia County in south central Wisconsin...\nSouthwestern Marquette County in south central Wisconsin...\n\n* Until 945 PM CDT.\n\n* At 911 PM CDT, a severe thunderstorm capable of producing a tornado\nwas located 8 miles east of Wisconsin Dells, moving northeast at 45\nmph.\n\nHAZARD...Tornado.\n\nSOURCE...Radar indicated rotation.\n\nIMPACT...Flying debris will be dangerous to those caught without\nshelter. Mobile homes will be damaged or destroyed.\nDamage to roofs, windows, and vehicles will occur.  Tree\ndamage is likely.\n\n* Locations impacted include...\nPackwaukee, Endeavor and Briggsville.'

print(re.search(r'Tornado Warning for\.\.\.([\W\w]*?)\n\n\*', description).group())

"""
Tornado Warning for...
Northwestern Columbia County in south central Wisconsin...
Southwestern Marquette County in south central Wisconsin...

*
"""