簡體   English   中英

正則表達式,在另一個詞之前和之后提取詞

[英]Regex, extract word before and after another one

您好,我在使用正則表達式從文本中提取特定單詞時遇到問題。 線路:

limk ab1
limk ab2 helo
rest helo
ab3 limk helo
ab4 limk

僅當limk在我要查找的單詞之前或之后,並且如果limk在它之前應該limk ,如果它的在后-應該在行的末尾,則我需要3個字母單詞作為輸出。 在這一行中,我只需要尋求潛伏和價值。

預期輸出:

ab1
ab4

我的正則表達式:

r'(^[0-9a-zA-Z]{3} \blimk\b)|(\blimk\b [0-9a-zA-Z]{3}$)'

有人可以解釋我該如何糾正? 謝謝

這是否滿足您的要求:

^(\\w{3}) limk$|^limk (\\w{3})$

https://regex101.com/r/S1OMmi/2

您可以使用

(?m)^(?:limk\s+([a-zA-Z0-9]{3})|([a-zA-Z0-9]{3})\s+limk)$

參見regex演示

細節

  • (?m) -使錨點與換行符匹配
  • ^ -一行的開始
  • (?: -啟動一個不捕獲容器的組(將錨應用於所有替代方案):
    • limk行尾的limk
    • \\s+ -1+空格
    • ([0-9a-zA-Z]{3}) -捕獲第1組:三個字符
  • | - 要么
    • ([0-9a-zA-Z]{3}) -捕獲第2組:三個字母
    • \\s+ -1+空格
    • limk -一個limk
  • ) -分組結束
  • $ -字符串結尾。

Python代碼

import re
rx = re.compile(r"^(?:limk\s+([a-zA-Z0-9]{3})|([a-zA-Z0-9]{3})\s+limk)$", re.M)
s = "limk ab1\nlimk ab2 helo\nrest helo\nab3 limk helo\nab4 limk"
print (["{}{}".format(x,y) for x,y in rx.findall(s)])
# => ['ab1', 'ab4']
^([0-9a-zA-Z]{3})\s+limk$|^limk\s+([0-9a-zA-Z]{3})$
  1. ^匹配行首
  2. [0-9a-zA-Z] {3}匹配大小寫的ascii字符以及長度為3的數字
  3. \\ s +匹配1個或更多空格
  4. 火柴
  5. $匹配行尾
  6. | 第二種替代方法的開始:
  7. ^匹配行首
  8. 符合limk
  9. \\ s +匹配一個或多個空格
  10. [0-9a-zA-Z] {3}匹配大小寫的ascii字符以及長度為3的數字
  11. $匹配行尾

編碼:

import re

s = """limk ab1
limk ab2 helo
rest helo
ab3 limk helo
ab4 limk"""

matches = [x[0] if x[0] != '' else x[1] for x in re.findall(r'(?m)^([0-9a-zA-Z]{3})\s+limk$|^limk\s+([0-9a-zA-Z]{3})$', s)]
for match in matches:
    print(match)

打印:

ab1
ab4

觀看演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM