Python 中的正则表达式问题
Problem with Regular Expression in Python
我在 python 中有一个函数,其中 returns 是 Natural-Sort/Human 算法的给定键的元组。
参见 fake _human_key。
但我需要这个来更改它以用标准字母字符替换德语变音符号。
长话短说,我想去掉 Ä, Ö, Ü, ß
进行排序。
另外,这种情况应该不考虑。小 d
应该与大写 D
...
具有相同的优先级
对于变音符号,我正在使用替换功能,这似乎是一种非常笨拙的方法...:-/ 我没有更好的主意...有什么建议吗?
此外,我无法重写它以摆脱区分大小写...
到目前为止我有:
def _human_key(key):
key = key.replace("Ä", "A").replace("Ö", "O").replace("Ü", "U")\
.replace("ä", "a").replace("ö", "o").replace("ü", "u")\
.replace("ß", "s")
parts = re.split(r'(\d*\.\d+|\d+)', key)
return tuple((e.swapcase() if i % 2 == 0 else float(e))
for i, e in enumerate(parts))
return parts
示例:我有值
Zabel
Schneider
anabel
Arachno
Öztürk
de 'Hahn
我要排序;目前这表明:
anabel
de 'Hahn
Arachno
Öztürk
Schneider
Zabel
因为小字a优先处理...
期望:
anabel
Arachno
de 'Hahn ( <-- because "d" comes after "a")
Öztürk
Schneider
我觉得替换不是解决变音符号问题的正确方法,但找不到更好的解决方案。
Update/Background信息:
我是从外部调用的,来自 class "QSortFilterProxyModel",
我需要这个来根据点击的列对行进行排序。
我有一个 QTreeView,它显示数据库中的结果集,其中一列包含德国姓氏,这就是背景。
class HumanProxyModel(QtCore.QSortFilterProxyModel):
def lessThan(self, source_left, source_right):
data_left = source_left.data()
data_right = source_right.data()
if type(data_left) == type(data_right) == str:
return _human_key(data_left) < _human_key(data_right)
return super(HumanProxyModel, self).lessThan(source_left, source_right)
有帮助吗?
import locale
locale.setlocale(locale.LC_ALL, "")
lst = ['Zabel', 'Schneider', 'anabel', 'Arachno', 'Öztürk', 'de Hahn']
print(sorted(lst, key=locale.strxfrm))
给我:
['anabel', 'Arachno', 'de Hahn', 'Öztürk', 'Schneider', 'Zabel']
为了更进一步,我一直在:http://code.activestate.com/recipes/576507-sort-strings-containing-german-umlauts-in-correct-/
更新
好吧,如果你想保留你的方法并摆脱变音符号,你可以这样做,有很多更好的方法,但这只是一个开始:
import locale
locale.setlocale(locale.LC_ALL, "")
lst = ['Zabel', 'Schneider', 'anabel', 'Arachno', 'Öztürk', 'de Hahn']
def _human_key(your_list):
your_list.sort(key=locale.strxfrm)
res = []
for item in your_list:
word = item.replace("Ä", "A").replace("Ö", "O").replace("Ü", "U")\
.replace("ä", "a").replace("ö", "o").replace("ü", "u")\
.replace("ß", "s")
res.append(word)
return res
print(_human_key(lst))
给我:
['anabel', 'Arachno', 'de Hahn', 'Ozturk', 'Schneider', 'Zabel']
没什么意思,但是如果您无法在您的方法中实现前面的代码,那么使用 Regex 似乎不是解决您的问题的适当标记 and/or 方法。
希望对您有所帮助
如果你不介意使用第三方模块,你可以使用natsort
(完全公开,我是作者)。对于您提供的数据,returns 开箱即用。
>>> from natsort import natsorted, ns
>>> data = ['Zabel', 'Schneider', 'anabel', 'Arachno', 'Öztürk', 'de Hahn']
>>> natsorted(data, alg=ns.LOCALE) # ns.LOCALE turns on locale-aware handling
['anabel', 'Arachno', 'de Hahn', 'Öztürk', 'Schneider', 'Zabel']
>>> from natsort import humansorted
>>> humansorted(data) # shortcut for using LOCALE
['anabel', 'Arachno', 'de Hahn', 'Öztürk', 'Schneider', 'Zabel']
如果需要排序键,可以使用natsort
的键生成器:
>>> from natsort import natsort_keygen, ns
>>> humansort_key = natsort_keygen(alg=ns.LOCALE)
>>> humansort_key(this) < humansort_key(that)
请注意,您不一定需要使用区域设置...您只需要正确规范化 unicode,natsort
会在后台自动执行此操作。在您的情况下,您似乎希望大写字母和小写字母都与小写字母组合在一起,所以您可以改用它
>>> natsorted(data, alg=ns.GROUPLETTERS | ns.LOWERCASEFIRST) # or ns.G | ns.LF
['anabel', 'Arachno', 'de Hahn', 'Öztürk', 'Schneider', 'Zabel']
我建议这样做是因为尝试处理区域设置是一场噩梦,如果不需要它那么你会好得多。
我在 python 中有一个函数,其中 returns 是 Natural-Sort/Human 算法的给定键的元组。
参见 fake _human_key。
但我需要这个来更改它以用标准字母字符替换德语变音符号。
长话短说,我想去掉 Ä, Ö, Ü, ß
进行排序。
另外,这种情况应该不考虑。小 d
应该与大写 D
...
对于变音符号,我正在使用替换功能,这似乎是一种非常笨拙的方法...:-/ 我没有更好的主意...有什么建议吗?
此外,我无法重写它以摆脱区分大小写...
到目前为止我有:
def _human_key(key):
key = key.replace("Ä", "A").replace("Ö", "O").replace("Ü", "U")\
.replace("ä", "a").replace("ö", "o").replace("ü", "u")\
.replace("ß", "s")
parts = re.split(r'(\d*\.\d+|\d+)', key)
return tuple((e.swapcase() if i % 2 == 0 else float(e))
for i, e in enumerate(parts))
return parts
示例:我有值
Zabel
Schneider
anabel
Arachno
Öztürk
de 'Hahn
我要排序;目前这表明:
anabel
de 'Hahn
Arachno
Öztürk
Schneider
Zabel
因为小字a优先处理...
期望:
anabel
Arachno
de 'Hahn ( <-- because "d" comes after "a")
Öztürk
Schneider
我觉得替换不是解决变音符号问题的正确方法,但找不到更好的解决方案。
Update/Background信息:
我是从外部调用的,来自 class "QSortFilterProxyModel", 我需要这个来根据点击的列对行进行排序。 我有一个 QTreeView,它显示数据库中的结果集,其中一列包含德国姓氏,这就是背景。
class HumanProxyModel(QtCore.QSortFilterProxyModel):
def lessThan(self, source_left, source_right):
data_left = source_left.data()
data_right = source_right.data()
if type(data_left) == type(data_right) == str:
return _human_key(data_left) < _human_key(data_right)
return super(HumanProxyModel, self).lessThan(source_left, source_right)
有帮助吗?
import locale
locale.setlocale(locale.LC_ALL, "")
lst = ['Zabel', 'Schneider', 'anabel', 'Arachno', 'Öztürk', 'de Hahn']
print(sorted(lst, key=locale.strxfrm))
给我:
['anabel', 'Arachno', 'de Hahn', 'Öztürk', 'Schneider', 'Zabel']
为了更进一步,我一直在:http://code.activestate.com/recipes/576507-sort-strings-containing-german-umlauts-in-correct-/
更新
好吧,如果你想保留你的方法并摆脱变音符号,你可以这样做,有很多更好的方法,但这只是一个开始:
import locale
locale.setlocale(locale.LC_ALL, "")
lst = ['Zabel', 'Schneider', 'anabel', 'Arachno', 'Öztürk', 'de Hahn']
def _human_key(your_list):
your_list.sort(key=locale.strxfrm)
res = []
for item in your_list:
word = item.replace("Ä", "A").replace("Ö", "O").replace("Ü", "U")\
.replace("ä", "a").replace("ö", "o").replace("ü", "u")\
.replace("ß", "s")
res.append(word)
return res
print(_human_key(lst))
给我:
['anabel', 'Arachno', 'de Hahn', 'Ozturk', 'Schneider', 'Zabel']
没什么意思,但是如果您无法在您的方法中实现前面的代码,那么使用 Regex 似乎不是解决您的问题的适当标记 and/or 方法。 希望对您有所帮助
如果你不介意使用第三方模块,你可以使用natsort
(完全公开,我是作者)。对于您提供的数据,returns 开箱即用。
>>> from natsort import natsorted, ns
>>> data = ['Zabel', 'Schneider', 'anabel', 'Arachno', 'Öztürk', 'de Hahn']
>>> natsorted(data, alg=ns.LOCALE) # ns.LOCALE turns on locale-aware handling
['anabel', 'Arachno', 'de Hahn', 'Öztürk', 'Schneider', 'Zabel']
>>> from natsort import humansorted
>>> humansorted(data) # shortcut for using LOCALE
['anabel', 'Arachno', 'de Hahn', 'Öztürk', 'Schneider', 'Zabel']
如果需要排序键,可以使用natsort
的键生成器:
>>> from natsort import natsort_keygen, ns
>>> humansort_key = natsort_keygen(alg=ns.LOCALE)
>>> humansort_key(this) < humansort_key(that)
请注意,您不一定需要使用区域设置...您只需要正确规范化 unicode,natsort
会在后台自动执行此操作。在您的情况下,您似乎希望大写字母和小写字母都与小写字母组合在一起,所以您可以改用它
>>> natsorted(data, alg=ns.GROUPLETTERS | ns.LOWERCASEFIRST) # or ns.G | ns.LF
['anabel', 'Arachno', 'de Hahn', 'Öztürk', 'Schneider', 'Zabel']
我建议这样做是因为尝试处理区域设置是一场噩梦,如果不需要它那么你会好得多。