2016-09-27 86 views
0

我懷疑這是可能的,但我還沒有發現任何具體說這是不可能的。但是有什麼方法可以在搜索中構建並行交替並替換正則表達式?因此,舉例來說,如果我想用自己的縮寫來代替街上的類型,可能我做這樣的事情:可以用regex替代替換嗎?

s/(STREET|AVENUE|BOULEVARD)/(ST|AVE|BLVD)/ 

,而不必取代整個RHS?或者我真的必須爲每種街道類型分別進行替換嗎?

+1

語言?你可以通過調用一個函數在Perl和Python中執行此操作。 – dawg

+1

您使用哪種語言?許多語言允許您在更換時使用函數,然後根據匹配的字符串它可以提供不同的替換。例如。 PHP'preg_replace_callback()'。 – Barmar

+0

如果你在文本編輯器中這樣做,這可能是不可能的。 – Barmar

回答

3

這不是漂亮,但它會完成這項工作:

更換

(?:(ST)REET|(AVE)NUE|(B)OU(L)E(V)AR(D)) 

\1\2\3\4\5\6 

它匹配的話,捕捉相關部分。替換爲所有捕獲組並插入相關部分。

See it here at regex101

+0

那麼,我們可以提高平行替換的賭注,這不是嚴格的縮寫嗎? - 讓 /(FIRST | SECOND |第三)/ 可以通過 1ST更換|第二屆| 3RD –

+2

不無編程邏輯(據我所知),(或者像提到的,記事本+ +和喜歡... ) – ClasG

1

這取決於您使用的語言或工具。例如,使用記事本+ +,你可以替換

(STREET)|(AVENUE)|(BOULEVARD) 

有:

(?1ST)(?2AVE)(?3BLVD) 
2

在Python中,你可以使用一個回調到一個字典,像這樣:

>>> abs={'STREET':'ST', 'AVENUE':'AVE','BOULEVARD':'BLVD'} 
>>> re.sub(r'(STREET|AVENUE|BOULEVARD)', lambda m: abs[m.group(1)], 'Fourth STREET') 
'Fourth ST' 

在Perl中,你可以這樣做:

use strict; 
use warnings; 

my %abs=(
    'STREET', 'ST', 
    'AVENUE' ,'AVE', 
    'BOULEVARD', 'BLVD' 
); 
$_='Fourth STREET'; 
s/(STREET)|(AVENUE)|(BOULEVARD)/$abs{$1}/ && print; 
3

的樂趣,併爲這三個字只是在PCRE /的Perl/Python的正則表達式模塊/ NPP:

(?:\G(?!^)|\b(?=(?:STREET|AVENUE|BOULEVARD)\b))[A-Z]*?\K(?:TREE|E(?:NU)?|OU|AR)\B 

替換爲空字符串。

demo

或者這一個:

\G[A-Z]*?(?>\W*\b(?>\w+\W+)*?(?=(?:STREET|AVENUE|BOULEVARD)\b))?[A-Z]*?\K(?:TREE\B|E(?:NU)?\B|OU\B|AR\B) 

demo

-1

好,前兩子是不是太困難:

import re 

s = 'street'; a = 'avenue'; b = 'boulevard' 

re.sub(r'(str)eet|(ave)nue|(boulevard)', r'\1 \2 \3', s) 
re.sub(r'(str)eet|(ave)nue|(boulevard)', r'\1 \2 \3', a) 
re.sub(r'(str)eet|(ave)nue|(boulevard)', r'\1 \2 \3', b) 

最後三行返回比賽加上空白的空間爲非墊子的組高等教育委員會。我想可能需要對字符串做進一步的處理,以便從上面的正則表達式中獲取'boulevard'的'blvd'。儘管這是合理的,因爲從「林蔭大道」提取一組子字符串與捕獲和替換一組替代正則表達式中的一個是分開的問題。

也許,因爲這種方式已經要求刪除空白的額外的步驟,我們可以做這樣的事情:

#with boulevard 
new_str = re.sub(r'(str)eet|(ave)nue|(b)oulevard', r'\1 \2 \3lvd', b) 
re.sub(r'\s+|\blvd', '', new_str) 

#with avenue 
new_str = re.sub(r'(str)eet|(ave)nue|(b)oulevard', r'\1 \2 \3lvd', a) 
re.sub(r'\s+|\blvd', '', new_str) 

代碼看起來有點滑稽,但。

+0

嗯... [這個例子在regex101罷工你](https://regex101.com/r/38q300/2)? – ClasG

+0

@ClasG,正如我所說的,有趣(不好)。這就是爲什麼我添加了一行代碼,它可以在左側立即刪除任何空格或序列'lvd',並帶有文字邊界。 –

+0

然後我們留下[this](https://regex101.com/r/38q300/3);) – ClasG