检测字符串中的“♪”

Detecting "♪" in String

如果之前已经post编辑过,我真的很抱歉,但我根本无法在网上找到答案。

我正在阅读字幕,希望排除主题song/ending。它们在带有“♪”符号的行的开头表示。我尝试使用 ASCII 值和 chr() 命令,但无法使其正常工作。

如果有人能 post 一种查看“♪”符号何时出现在字符串中的方法,将不胜感激。

感谢您的宝贵时间。

"♪"不在ASCII字符集中。它采用 IBM PC 上使用的字体,位于位置 13 (0x0D)。在 unicode 字符集中它位于位置 0x266A,因此在 Python 中你可以使用 u"\u266A"。如果您指定源文件的编码,您可以在字符串中包含任何字符:

# -*- coding: utf-8 -*-
print("♪")

请注意还有一个问题:python 如果输出代码页无法对该字符进行编码,则会引发异常:

print("\u266A")

UnicodeEncodeError: 'charmap' codec can't encode character '\u266a' in position 0: character maps to <undefined>

如果你想打印到控制台,在python 3.4(可能更早,但在python 2.7)你可以通过更改代码页来解决这个问题(例如执行chcp 65001) 在开始你的程序之前。

遍历输入字幕文件中的行,并将那些不以 u'\u266a' (♪) 开头的行写入输出文件。

对于 Python 2 & 3:

with open('file.srt') as subs, open('outfile.srt', 'w') as out:
    for line in subs:
        if not line.startswith(u'\u266a'):
            out.write(line)

如果您想在任何地方查找包含 ♪ 的行,只需使用 in:

if not u'\u266a' in line:

这当然会删除 所有 以 ♪ 开头的行,而不仅仅是歌曲结尾中的行。它甚至可能无效,因为不同的字幕文件格式做事不同。要仅删除那些字幕行,需要了解播放主题曲的时间范围,并且这需要了解字幕文件格式,因为时间码表示形式各不相同。例如,SRT 文件包含多个字幕行,如下所示:

3
00:01:25,640 --> 00:01:27,510
Go any deeper...

4
00:01:28,160 --> 00:01:29,700
.. we die.

所以现在你需要检测以♪开头的行,然后备份并删除前面的2行,并删除下面的行。我不是文件格式方面的专家....第一行看起来像一个序列号,我不知道它是否必须是连续的。在这种情况下,通常更容易将整个文件读入列表,然后处理该列表。

无论如何,现在您知道了如何检测以特定 Unicode 字符开头的行,因此您可以从那里继续。

def find_music_in_string(my_string):
    for char in my_string:
        if ord(char) == 9834:
            print 'i have found you ' + char

find_music_in_string(u'\u266a')

ord()获取一个char的int值,♪的值为9832。