字符串中的连续值,获取索引
Consecutive values in strings, getting indices
下面是一个python字符串,长度约为+1000。
string1 = "XXXXXXXXXXXXXXXXXXXXXAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBB........AAAAXXXXX"
len(string1) ## 1311
我想知道连续X的结尾和非X字符开始的索引。从左到右读取此字符串,第一个非 X 字符位于索引位置 22,从右数第一个非 X 字符位于索引位置 1306。
如何找到这些索引?
我的猜测是:
for x in string1:
if x != "X":
print(string.index(x))
这个问题是它输出所有不是 X 的索引。它没有给我连续 X 结束的索引。
更让我困惑的是如何 "check" 连续的 X。假设我有这个字符串:
string2 = "XXXXAAXAAAAAAAAAAAAAAABBBBBBBBBBBBBB........AAAAXXXXX"
在这里,连续的X在索引4处结束,而不是索引7。我如何检查前面的几个字符是否真的不再连续?
如果序列如您所说,仅在字符串的开头和结尾,则一个简单的循环/反向循环就足够了:
string1 = "XXXXXXXXXXXXXXXXXXXXXAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBB........AAAAXXXXX"
left_index = 0
for char in string1:
left_index += 1
if char != "X":
break
right_index = len(string1)
for char in reversed(string1):
if char != "X":
break
right_index -= 1
print(left_index) # 22
print(right_index) # 65
如果我理解你的问题,你就这样做:
def getIndexs(string):
lst =[]
flag = False
for i, char in enumerate(string):
if char == "x":
flag = True
if ((char != "x") and flag):
lst.append(i-1)
flag = False
return lst
print(getIndexs("xxxxbbbxxxxaaaxxxbb"))
[3, 10, 16]
使用正则表达式,拆分第一组和最后一组 X
,获取它们的长度以构建索引。
import re
mystr = 'XXXXAAXAAAAAAAAAAAAAAABBBBBBBBBBBBBB........AAAAXXXXX'
xs = re.split('[A-W|Y-Z]+', mystr)
indices = (len(xs[0]), len(mystr) - len(xs[-1]) - 1)
# (4, 47)
I simply need the outputs for the indices. I'm then going to put them in randint(first_index, second_index)
可以像这样将索引传递给函数
randint(*indices)
但是,我怀疑您想使用 randint(first_index, last_index)
的输出到 select 从中间开始的随机字符,这将是一个更短的选择。
from random import choice
randchar = choice(mystr.strip('X'))
正则表达式可以 lookahead
并识别与模式不匹配的字符:
>>>[match.span() for match in re.finditer(r'X{2,}((?=[^X])|$)', string2)]
[(0, 4), (48, 53)]
分解:
- X - 我们正在匹配的字符
- {2,} - 需要至少连续看到两个才能考虑匹配
(
(?=[^X])|
$)
- 两个条件都会满足匹配
- (?=[^X]) - 向前看 但 和
X
- $ - 字符串结尾
因此,finditer returns 每个实例都有多个 X,后跟一个非 X 或行尾。 match.span()
从字符串中提取每个匹配项的位置信息。
这将为您提供第一个索引和最后一个索引(非 'X' 字符)。
s = 'XXABCDXXXEFGHXXXXX'
first_index = len(s) - len(s.lstrip('X'))
last_index = len(s.rstrip('X')) - len(s) - 1
打印first_index、last_index
2 -6
工作原理:
对于first_index:
我们去掉字符串开头的所有 'X' 个字符。找出原始字符串和缩短后的字符串之间的长度差异,可以得到第一个非 'X' 字符的索引。
对于last_index:
同样,我们去掉字符串末尾的 'X' 个字符。我们还从差值中减去 1,因为 Python 中的反向索引从 -1 开始。
注:
如果你只想随机 select first_index 和 last_index 之间的字符之一,你可以这样做:
import random
shortened_s = s.strip('X')
random.choice(shortened_s)
下面是一个python字符串,长度约为+1000。
string1 = "XXXXXXXXXXXXXXXXXXXXXAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBB........AAAAXXXXX"
len(string1) ## 1311
我想知道连续X的结尾和非X字符开始的索引。从左到右读取此字符串,第一个非 X 字符位于索引位置 22,从右数第一个非 X 字符位于索引位置 1306。
如何找到这些索引?
我的猜测是:
for x in string1:
if x != "X":
print(string.index(x))
这个问题是它输出所有不是 X 的索引。它没有给我连续 X 结束的索引。
更让我困惑的是如何 "check" 连续的 X。假设我有这个字符串:
string2 = "XXXXAAXAAAAAAAAAAAAAAABBBBBBBBBBBBBB........AAAAXXXXX"
在这里,连续的X在索引4处结束,而不是索引7。我如何检查前面的几个字符是否真的不再连续?
如果序列如您所说,仅在字符串的开头和结尾,则一个简单的循环/反向循环就足够了:
string1 = "XXXXXXXXXXXXXXXXXXXXXAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBB........AAAAXXXXX"
left_index = 0
for char in string1:
left_index += 1
if char != "X":
break
right_index = len(string1)
for char in reversed(string1):
if char != "X":
break
right_index -= 1
print(left_index) # 22
print(right_index) # 65
如果我理解你的问题,你就这样做:
def getIndexs(string):
lst =[]
flag = False
for i, char in enumerate(string):
if char == "x":
flag = True
if ((char != "x") and flag):
lst.append(i-1)
flag = False
return lst
print(getIndexs("xxxxbbbxxxxaaaxxxbb"))
[3, 10, 16]
使用正则表达式,拆分第一组和最后一组 X
,获取它们的长度以构建索引。
import re
mystr = 'XXXXAAXAAAAAAAAAAAAAAABBBBBBBBBBBBBB........AAAAXXXXX'
xs = re.split('[A-W|Y-Z]+', mystr)
indices = (len(xs[0]), len(mystr) - len(xs[-1]) - 1)
# (4, 47)
I simply need the outputs for the indices. I'm then going to put them in
randint(first_index, second_index)
可以像这样将索引传递给函数
randint(*indices)
但是,我怀疑您想使用 randint(first_index, last_index)
的输出到 select 从中间开始的随机字符,这将是一个更短的选择。
from random import choice
randchar = choice(mystr.strip('X'))
正则表达式可以 lookahead
并识别与模式不匹配的字符:
>>>[match.span() for match in re.finditer(r'X{2,}((?=[^X])|$)', string2)]
[(0, 4), (48, 53)]
分解:
- X - 我们正在匹配的字符
- {2,} - 需要至少连续看到两个才能考虑匹配
(
(?=[^X])|
$)
- 两个条件都会满足匹配- (?=[^X]) - 向前看 但 和
X
- $ - 字符串结尾
- (?=[^X]) - 向前看 但 和
因此,finditer returns 每个实例都有多个 X,后跟一个非 X 或行尾。 match.span()
从字符串中提取每个匹配项的位置信息。
这将为您提供第一个索引和最后一个索引(非 'X' 字符)。
s = 'XXABCDXXXEFGHXXXXX'
first_index = len(s) - len(s.lstrip('X'))
last_index = len(s.rstrip('X')) - len(s) - 1
打印first_index、last_index
2 -6
工作原理:
对于first_index:
我们去掉字符串开头的所有 'X' 个字符。找出原始字符串和缩短后的字符串之间的长度差异,可以得到第一个非 'X' 字符的索引。
对于last_index:
同样,我们去掉字符串末尾的 'X' 个字符。我们还从差值中减去 1,因为 Python 中的反向索引从 -1 开始。
注:
如果你只想随机 select first_index 和 last_index 之间的字符之一,你可以这样做:
import random
shortened_s = s.strip('X')
random.choice(shortened_s)