【问题标题】:Detecting "♪" in String检测字符串中的“♪”
【发布时间】:2015-03-30 02:30:05
【问题描述】:

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

我正在阅读字幕并希望排除主题曲/结尾。它们在行首用“♪”符号表示。我尝试使用 ASCII 值和 chr() 命令,但无法使其正常工作。

如果有人可以发布一种方法来查看“♪”符号何时在字符串中,那将不胜感激。

感谢您的宝贵时间。

【问题讨论】:

  • 您能告诉我们您目前正在使用什么代码吗?
  • 您使用的是 Python 2.x 还是 3.x?
  • 你使用 python 3?是这样,你可以做a="♪gfdgsdfghgfh"; a.startswith("♪")。在 p3 中,字符串是 unicode。
  • '\xe2\x99\xaa' 是您角色的 Unicode 转义符
  • @jakekimds :不,这是编码为 UTF-8 的字符 b'\xe2\x99\xaa'.decode('utf8')u'\u266a'

标签: python string character ascii


【解决方案1】:

遍历输入字幕文件中的行并将那些不以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 再深入一点... 4 00:01:28,160 --> 00:01:29,700 ..我们死了。

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

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

【讨论】:

  • 对 SRT 文件的快速测试表明,至少对于 mplayer,仅删除字幕文本行并将前面的行保留在原处有效 - 实际上它是一个空白字幕。
【解决方案2】:
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。

【讨论】:

  • 使用 in 而不是在 Python 中循环。而且你不需要使用ord()...只需使用u"\u266a",即if u'\u266a' in my_string: print u'i have found you \u266a'
  • @mhawke 有没有办法在某个时候修改字符?不仅是查找是否有'♪'。
  • 在您的代码中,无法修改正在搜索的字符。如果需要,请将其作为参数传递给函数,然后您可以这样做:if char in my_string: print u'i have found you {}'.format(char)
【解决方案3】:

"♪" 不在 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)来解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 2011-11-02
    • 2015-10-11
    • 2013-05-01
    相关资源
    最近更新 更多