Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将全宽标点符号替换为标准宽度等效符号_Python_Bash_Unicode - Fatal编程技术网

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))