Python 如何拆分带数字的混合字符串
我有一个文本文件中的数据,其中包含“测试数据\u g004、测试数据\u g003、测试数据\u g001、测试数据\u g002” 是否可以在没有“测试数据”的情况下对其进行排序,以便将数据排序为g001、g002、g003等 我尝试了Python 如何拆分带数字的混合字符串,python,string,sorting,file-io,Python,String,Sorting,File Io,我有一个文本文件中的数据,其中包含“测试数据\u g004、测试数据\u g003、测试数据\u g001、测试数据\u g002” 是否可以在没有“测试数据”的情况下对其进行排序,以便将数据排序为g001、g002、g003等 我尝试了.split(“testdata”)方法,但不起作用 def readFile(): #try block will execute if the text file is found try: fileName = open("
.split(“testdata”)
方法,但不起作用
def readFile():
#try block will execute if the text file is found
try:
fileName = open("test.txt",'r')
data = fileName.read().split("\n")
data.sort (key=alphaNum_Key) #alternative sort function
print(data)
#catch block will execute if no text file is found
except IOError:
print("Error: File do not exist")
return
#Human sorting
def alphaNum(text):
return int(text) if text.isdigit() else text
#Human sorting
def alphaNum_Key(text):
return [ alphaNum(c) for c in re.split('(\d+)', text) ]
您可以使用
re
执行此操作
import re
x="Test DATA_g004, Test DATA_g003, Test DATA_g001, Test DATA_g002"
print sorted(x.split(","),key= lambda k:int(re.findall("(?<=_g)\d+$",k)[0]))
重新导入
x=“测试数据\u g004、测试数据\u g003、测试数据\u g001、测试数据\u g002”
打印排序(x.split(“,”),key=lambda k:int(re.findall(“(?是,您可以)。您可以按每个测试子字符串中的最后3位数字排序:
# The string to be sorted by digits
s = "Test DATA_g004, Test DATA_g003, Test DATA_g001, Test DATA_g002"
# Create a list by splitting at commas, sort the last 3 characters of each element in the list as `ints`.
l = sorted(s.split(','), key = lambda x: int(x[-3:]))
print l
# [' Test DATA_g001', ' Test DATA_g002', ' Test DATA_g003', 'Test DATA_g004']
如果这对您很重要,您将需要修剪l
的元素,但这将适用于所有以3位数字结尾的Test
s
如果不需要测试数据
,可以执行以下操作:
# The string to be sorted by digits
s = "Test DATA_g004, Test DATA_g003, Test DATA_g001, Test DATA_g002"
# Create a list by taking the last 4 characters of sorted strings with key as last 3 characters of each element in the list as `int`s.
l = sorted((x[-4:] for x in s.split(',')), key = lambda x: int(x[-3:]))
print l
# ['g001', 'g002', 'g003', 'g004']
如果您的数据格式正确(即,g
后跟3位数字),这将非常有效。否则,请使用其他已发布答案中的正则表达式
另一种方法是在读取字符串时将其推入PriorityQueue
:
test.py
使用PQ的好处是,它将按排序顺序添加它们,从而减轻您的负担,并且是在线性时间内完成的
example.txt
以及输出:
13:25 $ python test.py
g001
g002
g003
g004
检索以g
开头的所有字符串,然后使用sorted
>>> s = "Test DATA_g004, Test DATA_g003, Test DATA_g001, Test DATA_g002, "
>>> sorted(re.findall(r'g\d+$', s))
['g001', 'g002', 'g003', 'g004']
另一种方法是仅使用内置方法:
>>> l = [x.split('_')[1] for x in s.split(', ') if x]
>>> l
['g004', 'g003', 'g001', 'g002']
>>> l.sort()
>>> l
['g001', 'g002', 'g003', 'g004']
听起来你想要“自然排序”。下面的,复制自,可能会这样做
import re
def natural_sort(l):
convert = lambda text: int(text) if text.isdigit() else text.lower()
alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
return sorted(l, key = alphanum_key)
但是,您一直在说您希望“在没有测试数据的情况下”进行排序"这对我来说意味着你没有讲全部情况。如果每次都是字面上的测试数据
,它不会影响排序:有或没有排序;这没关系。我打赌你真的很担心这个字符串前缀实际上随着文件名的不同而变化,你想完全忽略它,不管它是什么是,只关注数字部分。如果是这种情况,您可以将上面列表中的else text.lower()
替换为else None
import re
def natural_sort(l):
convert = lambda text: int(text) if text.isdigit() else text.lower()
alphanum_key = lambda key: [ convert(c) for c in re.split('(\d+)', key) ]
return sorted(l, key = alphanum_key)
此代码段应该可以正常工作。这种排序称为自然排序,通常用于字母数字的情况。排序功能可以正常工作。但是我在对“g001”进行排序时遇到了问题,基本上如何在没有字符串“Test data”?@Aurora_Titanium(x.replace('TestData','')的情况下对数据进行排序对于x英寸xs@Aurora_Titanium我已经在g
之后的末尾根据键integers
进行了排序对不起!我完全忘记了。我检查了我的旧项目,发现我使用了您的解决方案:)python社区比C或Java社区要好得多。他们对所有事情都投了反对票!我很欣赏你对如此简单、外观正常的数据使用切片re
。我认为这使答案和OP遗漏的内容更加清晰。非常好的解决方案。优雅而干净。
import re
def natural_sort(l):
convert = lambda text: int(text) if text.isdigit() else text.lower()
alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
return sorted(l, key = alphanum_key)
import re
def natural_sort(l):
convert = lambda text: int(text) if text.isdigit() else text.lower()
alphanum_key = lambda key: [ convert(c) for c in re.split('(\d+)', key) ]
return sorted(l, key = alphanum_key)