python - 忽略包含某些文本的行的一部分
问题描述
我有一个看起来像这样的字符串:
https:\\somegif.some\some-random-gif.gif *textinbetween?!@* abc-abc-abc
def-def-def
a something: 123-456-789-101
我需要获取与此 RegEx 匹配的所有字符串([\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'
但它也会删除abc-abc-abc
.
解决方案
在我看来,当您的正则表达式匹配时,您正试图忽略 url 及其内容 - 这是有道理的,因为 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*
。
推荐阅读
- android - jcenter.bitrary 库支持-v4/26.1.0 无法访问 || 安卓构建 || 离子构建 || 错误
- python - 具有多个值的张量的布尔值在 Pytorch 中不明确
- sqlite - 从 sqlite3 提取数据时定义时间的问题
- axios - 带有 Axios 和 Loopback 的“where”过滤器中的变量
- flutter - flutterBlue.connect(device, timeout: const Duration(seconds: 10),).listen(null); 飘飘然
- image - 如何将 []byte 对象转换为图像并将其作为 jpeg 图像存储在磁盘上
- ruby-on-rails - 使用 AJAX 插入部分表单
- php - 为什么 curl 脚本在使用 INSERT 查询时开始获取冗余值
- cassandra - Caasandra PRIMARY KEY 列“user”不能被限制,因为前面的列“eventtype”不受限制
- apache-kafka - Storm KafkaBolt 推送到多个 Kafka 主题