簡體   English   中英

用字符串中的字符串替換字符串中的字符串

[英]Replace strings in a string by a substring of those strings

假設我有一個這樣的字符串:

s = '(X_xy09 and X_foobar or (X_abc123 and X_something))'

我想把它變成

'(xy09 and foobar or (abc123 and something))'

然后 - 在這個特殊情況下 - 我可以做到

s.replace('X_', "")

它提供了所需的輸出。

但是,在我的實際數據中,可能不僅有X_而且還有其他前綴,因此上述replace語句不起作用。

我需要的是替代

大寫字母后跟下划線和任意字母和數字序列

通過

第一個下划線后的所有內容。

因此,要提取我可以使用的所需元素:

import re
print(re.findall('[A-Z]{1}_[a-zA-Z0-9]+', s))

打印

['X_xy09', 'X_foobar', 'X_abc123', 'X_something']

我現在怎樣才能取代這些元素

'(xy09 and foobar or (abc123 and something))'

如果您只需要替換大寫字母后跟下划線,則可以使用正則表達式r'[AZ]_'

s = '(X_xy09 and X_foobar or (X_abc123 and X_something))'
re.sub(r'[A-Z]_', '', s)

如果您沒有提到其他標准,則可能需要添加它。 (例如,您的某些目標值遵循單詞邊界,而某些目標值遵循括號。)如果您有像XY_something這樣的輸入,則上面可能會給出錯誤的輸出。 這取決於您對輸出的期望。

如果你需要刪除一個帶有下划線的大寫ASCII字母,只有當前面沒有單詞char並且后跟一個字母數字字符時,你可以使用

import re
s = '(X_xy09 and X_foobar or (X_abc123 and X_something))'
print(re.sub(r'\b[A-Z]_([a-zA-Z0-9])', r'\1', s))

請參閱Python演示正則表達式演示

圖案細節

  • \\b - 領先的單詞邊界
  • [AZ]_ - ASCII大寫字母和_
  • ([a-zA-Z0-9]) - 第1組(后來用替換模式中的\\1引用):1個字母數字字符。

另一個re.sub()方法:

import re

s = '(X_xy09 and X_foobar or (X_abc123 and X_something))'
result = re.sub(r'[A-Z]_(?=[a-zA-Z0-9]+)', '', s)

print(result)

輸出:

(xy09 and foobar or (abc123 and something))

  • [AZ]_(?=[a-zA-Z0-9]+) - (?=...) 正向前瞻斷言 ,確保被替換的[AZ]_子串后面跟着字母數字序列[a-zA-Z0-9]+

您可以將re.sub()與先行斷言一起使用:

>>> import re
>>> s = '(X_xy09 and X_foobar or (X_abc123 and X_something))'
>>> re.sub(r'\b[A-Z]_(?=[a-zA-Z0-9])', '', s)
'(xy09 and foobar or (abc123 and something))'

來自文檔

(?=...)
匹配if ...匹配next,但不消耗任何字符串。 這稱為先行斷言 例如, Isaac (?=Asimov)只有在跟隨'Asimov'后才會匹配'Isaac ' 'Asimov'

暫無
暫無

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

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