2017-08-15 123 views
0

我想選擇字符串中的所有長單詞:re.findall("[a-z]{3,}")如何正則表達式匹配一切,但長單詞?

但是,出於某種原因我只能使用替換字符。因此,我需要用空格替換3個或更多字母的單詞。 (例如,abc de1 fgh ijabc fgh

這樣的正則表達式看起來怎麼樣?

結果應該是所有「[a-z] {3,}」由空格連接起來。但是,您只能使用替換。

或者在Python:查找regex這樣

re.sub(regex, " ", text) == " ".join(re.findall("[a-z]{3,}", text)) 

下面是一些測試用例

import re 
solution_regex="..." 
for test_str in ["aaa aa aaa aa", 
       "aaa aa11", 
       "11aaa11 11aa11", 
       "aa aa1aa aaaa" 
       ]: 
    expected_str = " ".join(re.findall("[a-z]{3,}", test_str)) 
    print(test_str, "->", expected_str) 

    if re.sub(solution_regex, " ", test_str)!=expected_str: 
     print("ERROR") 

-> 
aaa aa aaa aa -> aaa aaa 
aaa aa11 -> aaa 
11aaa11 11aa11 -> aaa 
aa aa1aa aaaa -> aaaa 

注意空間並不比其他任何符號不同。

+0

我明白你的意思是隻有沒有數字的單詞和至少3個字母。如果它是正確的,那就把它放在問題中,如果沒有的話,把你的正確要求放在那裏。 – Gangnus

+0

是的,單詞被定義爲問題的第一行。我添加了一個Python表達式來使其更加清晰。 – Gerenuk

+0

:-)您已經忘記在標籤中提及該語言。另外,如果您正在搜索正確的正則表達式,請不要使用正則表達式進行定義。你是否要求我們正確設置任務?請用詞定義,請! – Gangnus

回答

3
\b(?:[a-z,A-Z,_]{1,2}|\w*\d+\w*)\b 

說明:

  • \b意味着你被border of word
  • (?: )尋找開始和結束串 - 非捕獲組
  • \w*\d+\w*至少包含一個數字,包括任何字數字,'_'和字母

Here你可以看到測試。

+0

這並不能替代所有的詞彙。我基本上想要選擇並替換對此的確切否定。 – Gerenuk

+0

「我想選擇所有長詞」 - 這是您問題的第一行!請編輯它! – Gangnus

+0

@Gerenuk答案被編輯。 – Gangnus

0

在AutoIt的這個工作對我來說

#include <Array.au3> 
$a = StringRegExp('abc de1 fgh ij 234234324 sdfsdfsdf wfwfwe', '(?i)[a-z]{3,}', 3) 
ConsoleWrite(_ArrayToString($a, ' ') & @CRLF) 

結果==> ABC FGH sdfsdfsdf wfwfwe

1

您可以使用正則表達式

(\ S \ B(\ d * [ az] \ d *){1,2} \ b)|(\ s \ b \ d + \ b)

並替換爲空字符串,這裏是山姆的python代碼Ë

import re 

regex = r"(\s\b(\d*[a-z]\d*){1,2}\b)|(\s\b\d+\b)" 

test_str = "abcd abc ad1r ab a11b a1 11a 1111 1111abcd a1b2c3d" 

subst = "" 

# You can manually specify the number of replacements by changing the 4th argument 
result = re.sub(regex, subst, test_str, 0) 

if result: 
    print (result) 

這裏是一個demo

+0

你拿a1a,但拒絕a11a。爲什麼?根據 – Gangnus

+0

這個問題,你的「大」字包括a1,這不是很大,感謝您糾正我的答案,你能看看更新後的演示嗎? – marvel308

+0

用詞,我認爲任何子字符串,如果3個或更多的字母。我更新了這個問題以更好地定義它。在這個版本中,如果數字在單詞之前或之後,你會得到不正確的結果開頭的數字也會造成麻煩。即使使用更正的版本。 – Gerenuk

0
import re 

regex = r"(?:^|\s)[^a-z\s]*[a-z]{0,2}[^a-z\s]*(?:\s|$)" 
str = "abc de1 fgh ij" 
subst = " " 

result = re.sub(regex, subst, str) 
print (result) 

輸出:

abc fgh 

說明:

(?:^|\s) : non capture group, start of string or space 
[^a-z\s]* : 0 or more any character that is not letter or space 
[a-z]{0,2} : 0, 1 or 2 letters 
[^a-z\s]* : 0 or more any character that is not letter or space 
(?:\s|$) : non capture group, space or end of string 
+0

1.使用\\ b。它更簡單。 2. [^ a-z \ s]是不是空格或小寫字母的任何字符。所以,字符串中的一個大字母將禁止找到任何單詞。 – Gangnus

+0

在這裏和那裏引入數字會導致不正確的結果。我更新了這個問題以更好地定義期望。 – Gerenuk

+0

@Gangnus:'\ b'不適用,因爲'de1'必須被移除。對於第二點,很容易添加不區分大小寫。 – Toto

0

隨着這裏發佈的其他想法,我想出了一個答案。我無法相信我錯過了:

([^a-z]+|(?<![a-z])[a-z]{1,2}(?![a-z]))+ 

https://regex101.com/r/IIxkki/2

比賽要麼不信,或最多非字母界兩個字母。

相關問題