我有这样的字符串:
ꐊ,ꀵ,\u0f6e,ⴗ,ꦚ,\u2d75,ꢯ,⾌,\ua97d,⩱,ㇴ,\u2d6e,鼺,\x00Ꞁ
我想过滤掉所有这些以斜杠开头的无效字符,我正尝试使用Python中的正则表达式进行过滤。
它确实像这样工作:
re.sub(r",\u0f6e,", r",deleted,", s)
但不是这样:
re.sub(r",\.{5},", r",deleted,", s)
它应该按照http://pythex.org工作,所以我想这是因为它们是无效字符吗?我该如何搭配?
编辑:@metatoaster说我的问题不明确:
由于输入字符串s
不是原始字符串,因此似乎出现了问题。
>>> s = ' ꐊ,ꀵ,\u0f6e,ⴗ,ꦚ,\u2d75,ꢯ,⾌,\ua97d,⩱,ㇴ,\u2d6e,鼺,\x00Ꞁ'
>>> re.sub(r",\u0f6e,", r",deleted,", s)
' ꐊ,ꀵ,deleted,ⴗ,ꦚ,\u2d75,ꢯ,⾌,\ua97d,⩱,ㇴ,\u2d6e,鼺,\x00Ꞁ'
答案 0 :(得分:3)
似乎您有一个带有未定义Unicode代码点的字符串。 https://www.youtube.com/api/timedtext?sparams=asr_langs%2Ccaps%2Cv%2Cxoaf%2Cxorp%2Cexpire&hl=en&signature=B50CC4269D15CD954D6946B6342194EDF9F6D01F.AF819BEDE91E0F31C8F02A04508E49FC02B4F504&xorp=True&v=FSyAehMdpyI&asr_langs=ja%2Cko%2Cen%2Cde%2Cpt%2Cru%2Cnl%2Cfr%2Cit%2Ces&xoaf=1&key=yttt1&caps=asr&lang=en&fmt=srv3
是表示为转义码的单个代码点。示例:
\u0f6e
请注意,打印字符串如何将字符显示为未定义的框。出于调试目的,它显示为转义代码。这些代码点有一些共同点。根据Unicode数据库,它们是C类(控制)代码点。他们也没有名字。一种快速的过滤方法是:
>>> s = 'ꐊ,ꀵ,\u0f6e,ⴗ,ꦚ,\u2d75,ꢯ,⾌,\ua97d,⩱,ㇴ,\u2d6e,鼺,\x00Ꞁ'
>>> s
'ꐊ,ꀵ,\u0f6e,ⴗ,ꦚ,\u2d75,ꢯ,⾌,\ua97d,⩱,ㇴ,\u2d6e,鼺,\x00Ꞁ'
>>> print(s)
ꐊ,ꀵ,,ⴗ,ꦚ,,ꢯ,⾌,,⩱,ㇴ,,鼺, Ꞁ
答案 1 :(得分:0)
如果您的字符串是按原样定义的,我看不出您的第一个re.sub
语句会如何工作。
>>> s = r' ꐊ,ꀵ,\u0f6e,ⴗ,ꦚ,\u2d75,ꢯ,⾌,\ua97d,⩱,ㇴ,\u2d6e,鼺,\x00Ꞁ'
>>> re.sub(r",\u0f6e,", r",deleted,", s)
' ꐊ,ꀵ,\\u0f6e,ⴗ,ꦚ,\\u2d75,ꢯ,⾌,\\ua97d,⩱,ㇴ,\\u2d6e,鼺,\\x00Ꞁ'
请注意如何保留第一个r'\u0f6e'
。在正则表达式中,\
字符也很特殊,因此也必须转义。可以使用\\
代替。现在尝试:
>>> re.sub(r",\\u0f6e,", r",deleted,", s)
' ꐊ,ꀵ,deleted,ⴗ,ꦚ,\\u2d75,ꢯ,⾌,\\ua97d,⩱,ㇴ,\\u2d6e,鼺,\\x00Ꞁ'
为了匹配实际表达式且不超过必要数量,请注意\\u
序列在0-9
和a-f
之间恰好有4个后续字符。与其尝试匹配任意5个字符,不如说更具体,例如:
>>> re.sub(r",\\u[0-9a-f]+,", r",deleted,", s)
' ꐊ,ꀵ,deleted,ⴗ,ꦚ,deleted,ꢯ,⾌,deleted,⩱,ㇴ,deleted,鼺,\\x00Ꞁ'
请注意,整个答案都假设您给我们的信息是正确的,转义序列实际上是反斜杠字符。更新您的问题以包含这些代码片段(如我在这里所做的事情那样不那么模棱两可)会很有用(因为我们可以复制粘贴您的代码并运行它以查看出了什么问题,并且我们也可以对其进行更多纠正)轻松)。