python - Python 中的正则表达式问题

标签 python regex natural-sort

我在 python 中有一个函数,它返回自然排序/人类算法的给定键的元组。

参见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

示例:我有值(value)观

 Zabel
 Schneider
 anabel
 Arachno
 Öztürk
 de 'Hahn

我想要排序;目前这使得:

anabel
de 'Hahn
Arachno
Öztürk
Schneider
Zabel

因为小字符优先处理...

期望:

anabel
Arachno
de 'Hahn   ( <-- because "d" comes after "a")
Öztürk
Schneider

我觉得替换不是解决元音变音问题的正确方法,但找不到更好的解决方案。

更新/背景信息:

我从外部的“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']

没什么意义,但是如果您无法在方法中实现前面的代码,那么使用正则表达式似乎不是解决您的问题的适当标记和/或方法。 希望对您有帮助

关于python - Python 中的正则表达式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55260947/

相关文章:

javascript - 在 MongoDB 中按字母顺序对文档进行排序(也称为自然排序顺序,人类排序)

java - 在 Android 中使用自然排序顺序对 ArrayList 进行排序?

python - 如何在不必编写 20 个 if 语句或制作 20 个列表/字典的情况下进行以下比较?

python - Django 1.7 出现 ImportError,无法导入名称模式

python - 将df中的许多列减去另一df中的一列

regex - 在 pymongo 中创建文本索引

Javascript 用正则表达式替换,但仅替换第一个字符

javascript - 用

Python在网页弹出窗口中从电脑中选择图像

emacs - Emacs Lisp 的自然顺序排序