如何获取字符串中重复出现的字符的位置?

How can I get the position of a recurring character in a string?

我有这个字符串:

|C100|0|1|F120570|55|00|32|754929|35150456228356008116550320007549291371271334|17042015|20042015|2077,14|1|2062,48|0,00|3729,51|9|0,00|0,00|3,51|0,00|0,00|0,00|0,00|0,00|0,00|0,00|0,00|0,00|

我需要找到第 23 个“|”的 index / position使用 Python.

因为我有多个“|”,我不知道该怎么做..

我找到这个代码来查找第二次出现

def get_second_index(input_string, sub_string):
    return input_string.index(sub_string, input_string.index(sub_string) + 1)

但这并不能帮助我解决问题。

我想也许我可以通过像 while x < 23: 这样的循环来获得它,但我无法弄清楚如何...

我能想到的最简单的方法是遍历每个字符并记录找到的字符数 '|'

count = 0
for index, c in enumerate(string):
   if c == '|':
      count = count + 1
   if count == 23:
      print index
      break
x = 0
for index, char in enumerate(string):
    if char == "|" and x == 23:
        output_index = index
    elif char == "|":
        x += 1
print output_index

enumerate() returns 字符串、列表、字典等中每个元素的索引和值

您可以使用 re.finditer 来获得一个包含所有组的生成器 | 使用 re.matchObject.start() 方法 return 您的比赛的开始位置并获得第 23 个具有 enumerate 的元素和 next 函数中的生成器表达式:

>>> all_case=re.finditer(r'\|',s)
>>> next(j.start() for i,j in enumerate(all_case,1) if i==23)
154

您可以在循环中使用 string.find() 并随时调整起始索引。类似于以下内容:

start = -1
end = len(yourstring)
x = 0
while x < 23:
  start = string.find(yourstring, "|", start + 1, end)\
  x +=1
>>> [i for i, j in enumerate(input_string) if j == '|'][22]
>>> 154

生成一个列表,其中包含每次出现的 | 的索引,然后是 returns 第 23 个元素(=22,因为列表是零索引的)

假设 s 是输入字符串,你需要找到第 n 个位置 |:

def find_position(s, n, c):
  return len("".join(s.split(c, maxsplit = n)[:n])) + n - 1

您可以使用以下正则表达式来精确匹配 23 '|'字符:

text = "|C100|0|1|F120570|55|00|32|754929|35150456228356008116550320007549291371271334|17042015|20042015|2077,14|1|2062,48|0,00|3729,51|9|0,00|0,00|3,51|0,00|0,00|0,00|0,00|0,00|0,00|0,00|0,00|0,00|"

print re.match("(\|.*?){23}", text).end() - 1

这为您的示例文本提供了 154。