我有一个包含\x
ASCII十六进制字符串文字的python列表作为一些元素和常规字符串。有没有一种简单的方法可以将此列表拆分为两种不同类型的字符串?以下示例数据。
我已尝试在字符串中搜索\x
子字符串,但无法正常工作。
['\xFF', '\x42', 'A', '\xDE', '@', '\x1F']
编辑: 目前正在使用Python 2.7.9
这是我到目前为止所尝试的
>>> list=['\xFF', '\x42', 'A', '\xDE', '@', '\x1F']
>>> print [s for s in list if '\x' in s]
ValueError: invalid \x escape
>>> print [s for s in list if '\\x' in s]
[]
>>> print [s for s in list if '\x' in s]
ValueError: invalid \x escape
>>> print [s for s in list if 'x' in s]
[]
>>>
答案 0 :(得分:3)
您可以将列表理解与re.search一起使用。例如,要获取所有单词字符的新列表:
import re
x = ['\xFF', '\x42', 'A', '\xDE', '@', '\1F']
print([i for i in x if re.search('\w',i)])
或者仅按ASCII范围中的特定字符进行拆分,例如:
print([i for i in x if re.search('[\x05-\x40]',i)])
我选择了上面的任意范围。
答案 1 :(得分:1)
您可以查看每个字符串的repr
,以确定它是否包含\x
xs = ['\xFF', '\x42', 'A', '\xDE', '@', '\1F', 'hello\xffworld']
hexes = []
others = []
for x in xs:
if r'\x' in repr(x):
hexes.append(x)
else:
others.append(x)
print "hexes", hexes
print "others", others
输出:
hexes ['\xff', '\xde', '\x01F', 'hello\xffworld']
others ['B', 'A', '@']
答案 2 :(得分:0)
我将假设您将非十六进制数与十六进制值一起放入。如果您想要一个十进制数字字符串(例如' 25"被拒绝,您可以在将其标识为数字后检查十六进制指示符,如下所示。
似乎How do I check if a string is a number (float) in Python?中显示的代码可能是进行此测试的好方法。只需循环并根据测试结果将您的字符串放入正确的列表中。
同样的功能也显示在[检查Python字符串是否为数字](http://pythoncentral.io/how-to-check-if-a-string-is-a-number-in-python-including-unicode/}
不同之处在于第二组代码检查unicode以及常规字符串转换。
def is_number(s):
try:
float(s)
return True
except ValueError:
pass
try:
import unicodedata
unicodedata.numeric(s)
return True
except (TypeError, ValueError):
pass
return False