簡體   English   中英

使用正則表達式精確搜索帶括號的字符串

[英]Exact search of a string that has parenthesis using regex

我是正則表達式的新手。

我有以下字符串: \n(941)\n364\nShackle\n(941)\nRivet\n105\nTop

從這個字符串中,我想提取Rivet並且我已經將(941)作為變量中的字符串。

我的思考過程是這樣的:

  1. 找到所有(941) s
  2. 通過檢查(941)之后的字符串是否后跟 \n、后跟一個單詞並以 \n 結尾來過濾結果
  3. 我為第二部分做了一個正則表達式: \n[\w\s\'\d\-\/\.]+$\n

我面臨的問題是,由於(941)中的括號,正則表達式將 941 作為一個組。 在第三步中,正則表達式可能是錯誤的,我可以稍后修復,但第一步我需要幫助來找到第二步(941) ,所以我可以應用第三步。

PS。

  1. 我知道我可以使用 python 字符串方法,如 find 然后循環搜索,但我想看看這是否可以直接使用正則表達式來完成。
  2. 我嘗試了以下正則表達式: (?:...)(941){1}和像這樣\(941\)的 make 正則表達式文字字符\沒有有用的結果。 也許我用錯了。

只是想知道是否可以使用正則表達式來完成。 雖然它可能對其他人也有用,或者對未來的觀眾來說是一個很好的分享。

謝謝

假設:

  • 你想避免只匹配數字;
  • 想要匹配由單詞字符組成的 substring(因此包括可能的數字);

嘗試轉義變量並通過 f-string 在正則表達式中使用它:

import re
s = '\n(941)\n364\nShackle\n(941)\nRivet\n105\nTop'
var1 = '(941)'
var2 = re.escape(var1)
m = re.findall(fr'{var2}\n(?!\d+\n)(\w+)', s)[0]
print(m)

印刷:

Rivet

如果變量中的文本應該完全匹配,請在替換到正則表達式時使用re.escape()將其轉義。

s = '\n(941)\n364\nShackle\n(941)\nRivet\n105\nTop'
num = '(941)'
re.findall(rf'(?<=\n{re.escape(num)}\n)[\w\s\'\d\-\/\.]+(?=\n)', s)

這會將(941)\n放在后面,因此它不包含在匹配中。 這避免了一場比賽結束時的\n與下一場比賽開始時的\n重疊的問題。

暫無
暫無

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

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