忽略包含某些文本的行的一部分

时间:2019-11-11 17:02:11

标签: python regex

我有一个看起来像这样的字符串:

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  // add authorization header with jwt token if available
  request = this.addTokenToRequest(request);
  return next.handle(request)
  .pipe(
    catchError(err => {
        if (err instanceof HttpErrorResponse) {
            switch ((<HttpErrorResponse>err).status) {
                case 406:
                    return this.handle406Error(request, next);
                // case 400:
                //     return <any>this.authenticationService.logout();
            }
        } else {
            return throwError(err);
        }
    }));

我需要获取与此RegEx https:\\somegif.some\some-random-gif.gif *textinbetween?!@* abc-abc-abc def-def-def a something: 123-456-789-101 匹配的所有字符串。

这是我用来获取这些字符串的代码:

([\w]+(\s*-\s*[\w]+){2,3})

这将输出:

import re

test_str = ("https:\\\\somegif.some\\some-random-gif.gif *textinbetween?!@* abc-abc-abc\n"
            "def-def-def\n"
            "a something: 123-456-789-101\n")
regex = r"([\w]+(\s*-\s*[\w]+){2,3})"

matches = re.finditer(regex, test_str, re.MULTILINE)

for match in matches:
    match = match.group()
    match = match.replace(" ", "")
    print(match)

我不需要some-random-gif abc-abc-abc def-def-def 123-456-789-101 。我该如何过滤。
我可以这样使用:

some-random-gif

但是它也会删除nohttp = str() for line in test_str.split('\n'): if 'http' not in line: nohttp += line + '\n'

2 个答案:

答案 0 :(得分:2)

无法判断为什么some-random-gif不匹配。

这将匹配空白边界的之间的项目:

(?<!\S)[\w]+(?:\s*-\s*[\w]+){2,3}(?!\S)

https://regex101.com/r/v7cMAv/1

答案 1 :(得分:1)

在我看来,当您的正则表达式匹配时,您试图忽略url及其内容-这很有意义,因为url可能具有与您的模式匹配的结构。

一种可能的解决方案是在搜索之前使用正则表达式从字符串中删除网址;假设url的结尾和要匹配的文本的开头之间似乎存在空格,则可以匹配从字符串开头开始的非空格字符,并检查以确保它们以“ http”开头或“ https”。

import re

instring = ("https:\\\\somegif.some\\some-random-gif.gif *textinbetween?!@* abc-abc-abc\n"
            "def-def-def\n"
            "a something: 123-456-789-101\n")

newstring = re.sub('^https?:\S*','',instring)

regex = r"([\w]+(\s*-\s*[\w]+){2,3})"

matches = re.finditer(regex, newstring, re.MULTILINE)

for match in matches:
    match = match.group()
    match = match.replace(" ", "")
    print(match)

Demo

如果该URL始终存在于您的测试字符串中,并且始终是第一个“单词”,则可以简单地使用^\S*来代替。