我有一个看起来像这样的字符串:
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'
。
答案 0 :(得分:2)
无法判断为什么some-random-gif
不匹配。
这将匹配空白边界的之间的项目:
(?<!\S)[\w]+(?:\s*-\s*[\w]+){2,3}(?!\S)
答案 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)
如果该URL始终存在于您的测试字符串中,并且始终是第一个“单词”,则可以简单地使用^\S*
来代替。