首页 > 解决方案 > 如何使用正则表达式从字符串中提取子字符串

问题描述

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

密尔沃基/沙利文国家气象局已发布\n\n*Tornado Warning for...\nNorthwestern Columbia County in south central Wisconsin...\nSouthwestern Marquette County in south central Wisconsin...\n\n*直到 CDT 晚上 945 点。\n\n* CDT 晚上 911 点,一场能够产生龙卷风的强雷暴\n位于威斯康星戴尔以东 8 英里处,正在移动向东北以 45\nmph 速度行驶。\n\nHAZARD...龙卷风。\n\nSOURCE...雷达指示旋转。\n\nIMPACT...飞行的碎片对于那些在没有避难所的情况下被捕获的人会很危险。移动房屋将被损坏或毁坏。\n屋顶、窗户和车辆都会受到损坏。树木\n可能会损坏。\n\n* 受影响的地点包括...\nPackwaukee、Endeavour 和 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*

谢谢你的帮助,对不起我的英语不好

标签: pythonpython-3.xregexstringsubstring

解决方案


你可以匹配

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

模式匹配:

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

正则表达式演示| Python 演示

例如

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...

推荐阅读