有点沮丧,我无法解决这个问题,但我想定义一个正则表达式,选择一个未知数量的单词(一些间隔,一些包含数字,一些强调)。
当我说“未知数量的单词”时,我很乐意将其限制为10,如果这更加真实。 基本上我正在扫描文件名,并且不怀疑有超过10个单词,但是不必设置限制就好了。
我到目前为止最好的是:
tc = re.findall(r'FROM CLIP NAME:\s\s(\w*\s*\w*\s*\w*\s*\w*\s*\w*\s*\w*\s*\w*\s*\w*\s*\w*\s*\w*)', text)
其中'FROM CLIP NAME:\ s \ s'将位于每一行的开头。
我上面的尝试完全失败,因为\ s读取换行符和空格,因此也从下一行抓取数据。
答案 0 :(得分:3)
FROM CLIP NAME:\s{2}([\w\s]*)$
您可以使用字符类来定义允许的字符(也可以是预定义的字符类,如\w
和\s
)并接受任意数量的字符。这样你就不会真正关心它将包含什么。您也可以使用点.
来匹配任何。
尾随$
将使正则表达式在结尾处要求结束。请注意,对于$
的基于行的行为,您需要为正则表达式使用re.M
标志,否则$
将匹配字符串的结尾。
re.compile('FROM CLIP NAME:\s{2}([\w\s]*)$', re.M)
如果在您的情况下FROM CLIP NAME:
是静态前缀,则不应使用正则表达式。正如eumiro所示,只需迭代这些行并删除前缀。
答案 1 :(得分:2)
如何不使用正则表达式?
检查一行是否以"FROM CLIP NAME: "
开头,然后将此开头剪掉并返回字符串的其余部分:
title = "FROM CLIP NAME: "
for line in lines:
if line.startswith(title):
tc = line[len(title):]
这会对行进行迭代,因此line
始终只在换行符之前。
如果您没有行(或文件对象)列表,而是文本,请使用for line in text.splitline()
。