Python 将全宽标点符号替换为标准宽度等效符号
Python 将全宽标点符号替换为标准宽度等效符号,python,bash,unicode,Python,Bash,Unicode,file1包含一些:s(全宽)我想变成常规的:s(这是我们的常规冒号)。在bash中如何执行此操作?也许是python脚本?您可以试试tr: cat file.ext | tr ":" ":" > file_new.ext 您可能需要研究Python的特性 它允许您获取unicode字符串,并将其规范化为特定形式,例如: unicodedata.normalize('NFKC',字符串) 以下是不同规范化形式的表格: 如果只想替换特定字符,可以使用unicode.translate(
file1
包含一些:
s(全宽)我想变成常规的:
s(这是我们的常规冒号)。在bash中如何执行此操作?也许是python脚本?您可以试试tr
:
cat file.ext | tr ":" ":" > file_new.ext
您可能需要研究Python的特性 它允许您获取unicode字符串,并将其规范化为特定形式,例如:
unicodedata.normalize('NFKC',字符串)
以下是不同规范化形式的表格:
如果只想替换特定字符,可以使用
unicode.translate()
>>>orig=u'\uFF1A:'
>>>表={0xFF1A:u':'}
>>>打印报告(原件)
>>>打印报告(原始翻译(表格))
u'\uFF1A:'
u'::'
恕我直言,python不是这项工作的合适工具;perl是:
或
或
或
我同意Python并不是实现这一目的的最有效工具。虽然到目前为止提供的选项都很好,
sed
是另一个很好的工具:
sed -i 's/\xEF\xBC\x9A/:/g' file.txt
i选项使sed就地编辑文件,如tchrist的perl示例所示。请注意,
\xEF\xBC\x9A
是UTF-16值的UTF-8等价物\xFF1A
。在需要处理相同Unicode值的不同编码时,是一个有用的参考。在Python 2.x中,您可以使用Unicode.translate
方法将单个Unicode码点转换为0、1或多个码点,使用
replacement_string = original_string.translate(table)
以下代码设置了一个转换表,该表将所有ASCII图形字符的全宽等效值映射为其ASCII等效值:
# ! is 0x21 (ASCII) 0xFF01 (full); ~ is 0x7E (ASCII) 0xFF5E (full)
table = dict((x + 0xFF00 - 0x20, unichr(x)) for x in xrange(0x21, 0x7F))
(参考:见)
如果您想以类似方式对待空格,请执行以下操作:
table[0x3000]=u'
为什么这个问题要用unicode标记?@Sentinel:因为u+FF1A全宽冒号是unicode代码点。我的回答没有帮助吗?在这之前有人问过…@Mike:那是因为tr不能使用Unicode。Perl确实如此。python-c….与我刚才给出的Perl一行程序有什么等价之处?添加了一个一行程序的尝试:)-1您显然还没有测试过这一点。(1) u'\x{FF1A}
是无效语法--使用u'\uFF1A'
(2)string.maketrans
用于str
对象,而不是unicode
对象--您需要table={0xFF1A:u':}
(3)您还没有将输入的str code
对象从utf8 big5/gbk/shift\jis/转换为unicode>对象,是的,我只测试过非unicode。。感谢您指出并解释所有更正!看起来我有点超前了。@Acorn:将全宽冒号转换为数字9是一个有点奇怪的例子。我同意,perl解决方案要简洁得多。虽然规范化文本可能也是OP的一个有趣的选择,但在编码级别处理事情总是错误的。您不必从这个或那个编码中拼写出特定的位模式。您应该始终只处理逻辑字符。其他任何事情都是疯狂的。
perl -CSAD -i.orig -Mcharnames=:full -pe 'tr[\N{FULLWIDTH COLON}][:]' file1
perl -CSAD -i.orig -Mcharnames=:full -pe 'tr[\N{FULLWIDTH EXCLAMATION MARK}\N{FULLWIDTH QUOTATION MARK}\{FULLWIDTH NUMBER SIGN}\N{FULLWIDTH DOLLAR SIGN}\N{FULLWIDTH PERCENT SIGN}\N{FULLWIDTH AMPERSAND}\{FULLWIDTH APOSTROPHE}\N{FULLWIDTH LEFT PARENTHESIS}\N{FULLWIDTH RIGHT PARENTHESIS}\N{FULLWIDTH ASTERISK}\N{FULLWIDTH PLUS SIGN}\N{FULLWIDTH COMMA}\N{FULLWIDTH HYPHEN-MINUS}\N{FULLWIDTH FULL STOP}\N{FULLWIDTH SOLIDUS}][\N{EXCLAMATION MARK}\N{QUOTATION MARK}\N{NUMBER SIGN}\N{DOLLAR SIGN}\N{PERCENT SIGN}\{AMPERSAND}\N{APOSTROPHE}\N{LEFT PARENTHESIS}\N{RIGHT PARENTHESIS}\N{ASTERISK}\N{PLUS SIGN}\N{COMMA}\{HYPHEN-MINUS}\N{FULL STOP}\N{SOLIDUS}]' file1
sed -i 's/\xEF\xBC\x9A/:/g' file.txt
replacement_string = original_string.translate(table)
# ! is 0x21 (ASCII) 0xFF01 (full); ~ is 0x7E (ASCII) 0xFF5E (full)
table = dict((x + 0xFF00 - 0x20, unichr(x)) for x in xrange(0x21, 0x7F))