簡體   English   中英

如何在 python 中使用正則表達式查找某些單詞?

[英]How to find certain words using regular expression in python?

我正在使用 Python 中的正則表達式學習繩索。 我有以下代碼:

import re

test = '"(Z101+Z102+Z1034+Z104)/4"'
regex = re.compile(r"[\(\+]([XYZ]\d\d\d)[\)\+]")
regex.findall(test)

它返回:

['Z101', 'Z104']

但是,當我將“Z101”更改為“YZ101”時:

import re

test = '"(YZ101+Z102+Z1034+Z104)/4"'
regex = re.compile(r"[\(\+]([XYZ]\d\d\d)[\)\+]")
regex.findall(test)

它返回:

['Z102', 'Z104']

目的是提取包含XYZ后跟任意三位數的字符串。 因此,第一個代碼所需的 output 將是:

['Z101', 'Z102', 'Z104']

如何修復編譯並獲得正確的 output?

左右手邊界模式( [\(\+][\)\+] )正在消耗它們匹配的文本,因此不會檢測到連續匹配。

您可以使用環視解決問題,

r"(?<=[(+])([XYZ]\d\d\d)(?=[)+])"
r"(?<=[(+])[XYZ]\d{3}(?=[)+])"

細節

  • (?<=[(+]) - 一個正向的后視,匹配緊接在(+之前的位置
  • [XYZ] - XYZ
  • \d{3} - 三位數
  • (?=[)+]) - 一個肯定的前瞻,確保在當前位置的右側有)+

請注意單詞邊界\b可以在某些情況下解決問題,在這里它也可能對您有所幫助。

re.findall與模式[XYZ]\d{3}\b一起使用:

test = '"(YZ101+Z102+Z1034+Z104)/4"'
matches = re.findall(r'[XYZ]\d{3}\b', test)
print(matches)  # ['Z101', 'Z102', 'Z104']

您的模式正在尋找:

  1. '(' 或 '+'
  2. 恰好是“X”、“Y”或“Z”之一
  3. 正好三個數字字符
  4. '(' 或 '+'

它沒有選擇“Z101”,因為當您添加“Y”時,substring 不會緊跟在“(”或“+”之前。

一種選擇是將 1 和 4 排除在模式之外。 在這個例子中,你會得到你想要的。 該模式將是 r'[XYZ]\d\d\d'。 但是,根據您的數據,這可能會在未來產生不同的問題。

另一種選擇是包含前綴字符“?”的可能性。 這 '?' 用作量詞時表示“零或一”(但它也可以修改其他量詞,但這是一個不同的主題)。 為此,您的模式將是 r"[(+][XYZ]?([XYZ]\d\d\d)[)+]"

暫無
暫無

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

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