我想可能在一組字串中提取“2022”之前的數字。我現在做
a= mystring.strip().split("2022")[0]
并且,例如,當 時mystring=' 1020220519AX',這給出了a = '10'。然而,
mystring.strip().split("2022")[0]
失敗時mystring=' 20220220519AX'回傳a='202'。因此,我希望代碼將字串拆分為“2022”,該字串不在字串開頭的非空白字符處。你能指導一下嗎?
uj5u.com熱心網友回復:
使用正則運算式而不是split().
import re
mystring = ' 20220220519AX'
match = re.search(r'^\s*(\d ?)2022', mystring)
if match:
print(match.group(1))
^\s*跳過開頭的空格,然后(\d ?)捕獲后面的數字直到第一個2022.
uj5u.com熱心網友回復:
您可以告訴正則運算式引擎您想要 2022 年之前的所有數字:
r'\d (?=2022)'
就像.split(),一個正則運算式引擎默認是“貪婪”的——這里的“貪婪”意味著只要它可以接受它被指示接受的東西,它就會接受它并且不會嘗試另一個選項,除非其余的表達無法發揮作用。
因此,在您的情況下,mystring.strip().split("2022")它可以在 2020 年的第一個分裂中找到,因為沒有什么可以阻止它,這就是您必須處理的結果。
使用正則運算式,您甚至可以告訴它您對 2022 不感興趣,但對它之前的數字不感興趣:\d 只要它可以找到一串數字(貪婪),它就會匹配,但該(?=2022)部分說它后面必須跟一個字面意思2022是匹配(這不會是匹配的一部分,“積極的前瞻”)。
使用類似的東西:
import re
mystring = ' 20220220519AX'
print(re.findall(r'\d (?=2022)', mystring))
將顯示所有連續的比賽。
請注意,對于類似 的字串' 920220220519AX 12022',它只會找到['9202', '1']- 它不會找到所有可能的匹配組合。第一個貪婪地通過成功的字串就是你得到的答案。
uj5u.com熱心網友回復:
您可以split()在使用 之后斷言不是左側字串的開頭strip(),或者您可以從字串開頭獲取第一次出現的 1 個或多個數字,以防 2022 出現更多
import re
strings = [
' 1020220519AX',
' 20220220519AX'
]
for s in strings:
parts = re.split(r"(?<!^)2022", s.strip())
if parts:
print(parts[0])
for s in strings:
m = re.match(r"\s*(\d ?)2022", s)
if m:
print(m.group(1))
兩者都會輸出
10
202
請注意,拆分變體不保證第一部分由數字組成,它只是被拆分。
如果字串僅由單詞字符組成,則在\B2022where上拆分\B意味著非單詞邊界,也將防止在示例字串的開頭進行拆分。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/497298.html
