【问题标题】:How to get a list of character positions in Python?如何获取 Python 中的字符位置列表?
【发布时间】:2011-03-06 21:59:19
【问题描述】:

我正在尝试编写一个函数来清理 Web 应用程序中的 unicode 输入,我目前正在尝试在本页末尾重现 PHP 函数:http://www.iamcal.com/understanding-bidirectional-text/

我正在 python 中寻找 PHP 的 preg_match_all 的等效项。 RE 函数 findall 返回没有位置的匹配项,而 search 只返回第一个匹配项。是否有任何函数可以返回每个匹配项以及文本中的相关位置?

使用字符串abcdefa 和模式a|c,我想得到类似[('a',0),('c',2),('a',6)] 的东西

谢谢:)

【问题讨论】:

  • 当心:该代码与单个 UTF-8 字节匹配,这通常是错误的做法。转换为 Unicode 字符串并正确地与 Unicode 代码点进行比较。
  • 感谢您指出这一点,但这只是一个可打印示例。最终解决方案将使用正则表达式u'\u202A|\u202B|\u202D|\u202E' 进行匹配;)

标签: python regex


【解决方案1】:

试试:

text = 'abcdefa'
pattern = re.compile('a|c')
[(m.group(), m.start()) for m in pattern.finditer(text)]

【讨论】:

  • +1 以获得如此优雅的解决方案。希望我能给的不仅仅是 1 票
  • 哇。非常感谢您的解决方案,正是我想要的 =)
【解决方案2】:

我不知道有什么方法可以让re.findall 为您执行此操作,但以下方法应该可以:

  1. 使用re.findall 查找所有匹配的字符串。
  2. 使用str.index 查找re.findall 返回的所有字符串的关联索引。 但是,当你这样做时要小心:如果一个字符串在不同的位置有两个确切的子字符串,那么re.findall 将返回两个,但你需要告诉str.index 你正在寻找对于字符串的第二次出现或nth 出现。否则,它将返回您已经拥有的索引。我能想到的最好方法是维护一个字典,其中包含re.findall 结果中的字符串作为键和索引列表作为值

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2021-07-16
    • 1970-01-01
    • 2011-01-18
    • 2016-08-15
    • 2019-12-10
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 2011-08-21
    相关资源
    最近更新 更多