1

有点沮丧,我无法解决这个问题,但我想定义一个选择未知数量的单词的正则表达式(一些间隔,一些合并数字,一些下划线)。

当我说“未知数量的单词”时,我很乐意将其限制为 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 读取换行符和空格,因此也从下一行获取数据。

4

2 回答 2

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 所示那样迭代这些行并去掉前缀。

于 2012-12-11T11:37:58.687 回答
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().

于 2012-12-11T11:31:02.087 回答