除了长话之外,如何正则表达式匹配所有内容?

时间:2017-08-15 11:56:49

标签: regex

我想从字符串中选择所有长词:re.findall("[a-z]{3,}")

然而,由于某种原因我只能使用替代品。因此,我需要用空格替换除了3个或更多字母的单词之外的所有内容。 (例如abc de1 fgh ij - > abc 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

请注意,空格与任何其他符号没有区别。

5 个答案:

答案 0 :(得分:3)

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showDetail" {

        // Destination View Controller
        let destinationNavigationcontroller: UINavigationController! = segue.destination as! UINavigationController
        let destinationViewController: DetailViewController! = destinationNavigationcontroller.topViewController as! DetailViewController

        // Selected Row ID
        let path = self.tableView.indexPathForSelectedRow! as  NSIndexPath
        destinationViewController.selectedId = (self.itemList[path.row] as! MyListItem).id
    }
}

说明:

  • \b(?:[a-z,A-Z,_]{1,2}|\w*\d+\w*)\b 表示您要查找的子字符串以\b开头和结尾
  • border of word - 非捕获群组
  • (?: )任何包含至少一位数字且由数字组成的字词,'_'和字母

Here你可以看到测试。

答案 1 :(得分:1)

您可以使用正则表达式

  

(\ S \ B(\ d * [A-Z] \ 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

答案 2 :(得分:0)

在Autoit中,这对我有用

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

结果==&gt; abc fgh sdfsdfsdf wfwfwe

答案 3 :(得分: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

答案 4 :(得分:0)

在这里发布其他想法后,我想出了一个答案。我不敢相信我错过了:

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

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

匹配非字母或最多两个由非字母限定的字母。