簡體   English   中英

搜索字符串並僅返回我指定的內容

[英]Searching a string and returning only things I specify

希望這篇文章越來越好..

所以我堅持這個程序的這個功能,它將返回指定某個關鍵字的整個單詞。

即 - 如果我告訴它在字符串“blah blah blah blah I=1mV blah blah etc?”中尋找單詞“I=”,它會返回找到它的整個單詞,所以在這種情況下,它會返回 I=1mV。

我嘗試了很多不同的方法,例如,

text = "One of the values, I=1mV is used"
print(re.split('I=', text))

但是,這會返回沒有 I 的相同字符串,因此它會返回

['One of the values, ', '1mV is used']

如果我嘗試正則表達式解決方案,我會遇到數字可能超過 1 位的問題,因此只有當數字是 1 位時,這段底部代碼才有效。 如果 I=10mV 是那個值,它只會返回一個,但如果我有兩次 [/0-9],代碼不再只使用 1 個值。

text = "One of the values, I=1mV is used"
print(re.findall("I=[/0-9]", text))

['I=1'] 

當我嘗試使用 re.match 時,

text = "One of the values, I=1mV is used"
print(re.search("I=", text))

<_sre.SRE_Match object at 0x02408BF0>

有什么好的取詞方法(在本例中,我要取I=1mV)並截取字符串的rest?

更好的方法是先將文本拆分為單詞:

>>> text = "One of the values, I=1mV is used"
>>> words = text.split()
>>> words
['One', 'of', 'the', 'values,', 'I=1mV', 'is', 'used']

然后過濾單詞以找到您需要的單詞:

>>> [w for w in words if 'I=' in w]
['I=1mV']

這將返回其中包含I=的所有單詞的列表。 然后我們可以只取第一個找到的元素:

>>> [w for w in words if 'I=' in w][0]
'I=1mV'

完成,我們可以做的就是尋找第一個匹配項來稍微清理一下。 而不是檢查每個單詞:我們可以為此使用生成器表達式:

>>> next(w for w in words if 'I=' in w)
'I=1mV'

當然,您可以調整if條件以更好地滿足您的需求,例如,您可以使用str.startswith()檢查單詞是否以某個字符串開頭,或者re.match()檢查單詞是否與模式匹配。

使用字符串方法

作為記錄,您嘗試使用I=作為分隔符將字符串分成兩半,這幾乎是正確的。 您可以使用str.partition() str.split()保留分隔符,而不是使用丟棄分隔符的 str.split() 。

>>> my_text = "Loadflow current was I=30.63kA"
>>> my_text.partition("I=")
('Loadflow current was ', 'I=', '30.63kA')

使用正則表達式

一個更靈活和健壯的解決方案是使用正則表達式:

>>> import re
>>> pattern = r"""
... I=             # specific string "I="
... \s*            # Possible whitespace
... -?             # possible minus sign
... \s*            # possible whitespace
... \d+            # at least one digit
... (\.\d+)?       # possible decimal part
... """
>>> m = re.search(pattern, my_text, re.VERBOSE)
>>> m
<_sre.SRE_Match object at 0x044CCFA0>
>>> m.group()
'I=30.63'

這說明了更多的可能性(負數,integer 或十進制數)。

注意使用:

  • 量詞表示你想要的每樣東西的數量。
    • a* - 零個或多個a s
    • a+ - 至少a
    • a? - “可選” - 一個或零a s
  • 帶有注釋的詳細正則表達式( re.VERBOSE標志) - 比非詳細等效項I=\s?-?\s?\d+(\.\d+)更容易理解上面的模式。
  • 正則表達式模式的原始字符串, r"..."而不是純字符串"..." - 意味着不必轉義文字反斜杠。 此處不需要,因為我們的模式不使用反斜杠,但有一天您需要匹配C:\Program Files\... ,而在那一天您將需要原始字符串。

練習

  • 練習 1:如何擴展它以便它也可以匹配單位? 您如何擴展它以便它可以將單位匹配為mAAkA 提示:“交替運算符”。

  • 練習 2:如何擴展它以匹配工程符號中的數字,即“1.00e3”或“-3.141e-4”?

import re
text = "One of the values, I=1mV is used"
l = (re.split('I=', text))
print str(l[1]).split(' ') [0]

如果你有多個I=對 l 中的每個奇數索引執行上述操作,因為 0 是第一個。

這是一個好方法,因為可以寫“使用其中一個值,I = 1mV”,我想你想知道 I 是 1mv。

順便說一句,我是電流的,它的單位是安培而不是伏特:)

通過您的 re.findall 嘗試,您可能想要添加一個+表示一個或多個。
這里有些例子:

import re

test = "This is a test with I=1mV, I=1.414mv, I=10mv and I=1.618mv."

result = re.findall(r'I=[\d\.]+m[vV]', test)

print(result)

test = "One of the values, I=1mV is used"

result = re.search(r'I=([\d\.]+m[vV])', test)

print(result.group(1))

第一次打印是: ['I=1mV', 'I=1.414mv', 'I=10mv', 'I=1.618mv']

在 re.search 示例中,我將I=以外的所有內容分組,
所以第二次打印是: 1mV
如果您有興趣提取它。

暫無
暫無

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

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