【问题标题】:Extracting content between two defined words in python using Regular expression使用正则表达式在python中两个定义的单词之间提取内容
【发布时间】:2020-07-12 14:54:50
【问题描述】:

这里我试图在 pointID 和 point Name 之间提取内容。如下图所示。

        import re
import pandas as pd
import numpy as np

sent1 = 'Date:2020/07/11 13:53  Low Alarm OFF\nAlarm Priority:Urgent\nPoint ID0000294.AI.0017707\nPoint Name:BOM-DC3-B2-2F-Q1-TEMP 3\nAlarm:Normal\nStatus:18.6 øC'
sent2 = 'Date:2020/07/11 13:42  Low AlarmAlarm Priority:UrgentPoint ID0000294.AI.0017707Point Name:BOM-DC3-B2-2F-Q1-TEMP 3Alarm:AbnormalStatus:Analog Lower Limit Alarm 18.0 øC'
def extract_id(sent):
    lst=re.split(r'\W+', sent)
    lst=str(lst[13]) + str(lst[14]) + str(lst[15])
    return(lst)

在这里,第一个 sent1 我能够在 pointidpoint Name 之间提取内容,但使用 sent2 我无法这样做。为什么,因为我将完整的句子拆分成一个列表,然后在 2015 年 13 月 14 日获取列表索引。这与sent2 不同。需要一个使用正则表达式的解决方案如何获取Point ID[Required content]Point Name之间的内容。

【问题讨论】:

标签: python-3.x regex string


【解决方案1】:

您可以在匹配 Point Name 之前使用匹配可选换行符。

对于所需的内容部分,您可以在 Point ID 之后匹配至少一个非空白字符 \S

Point ID(\S.*?)[\r\n]*Point Name\b

模式匹配

  • Point ID 字面匹配
  • (\S.*?) 捕获group 1,匹配非空白字符和除换行符以外的任何字符非贪婪
  • [\r\n]* 匹配 0+ 个换行符
  • Point Name\b 匹配点名称后跟单词边界

Regex demo | Python demo

import re

def extract_id(sent):
    regex = r"Point ID(\S.*?)[\r\n]*Point Name\b"
    return re.findall(regex, sent)

sent1 = 'Date:2020/07/11 13:53  Low Alarm OFF\nAlarm Priority:Urgent\nPoint ID0000294.AI.0017707\nPoint Name:BOM-DC3-B2-2F-Q1-TEMP 3\nAlarm:Normal\nStatus:18.6 øC'
sent2 = 'Date:2020/07/11 13:42  Low AlarmAlarm Priority:UrgentPoint ID0000294.AI.0017707Point Name:BOM-DC3-B2-2F-Q1-TEMP 3Alarm:AbnormalStatus:Analog Lower Limit Alarm 18.0 øC'

print(extract_id(sent1))
print(extract_id(sent2))

输出

['0000294.AI.0017707']
['0000294.AI.0017707']

【讨论】:

  • 我们也可以使用 id = re.compile(r"Point ID(\S.*?)[\r\n]*Point Name\b") 来优化响应时间。
猜你喜欢
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多