我在python中的re.finditer()方法遇到了一些麻烦.例如:
>>>sequence = 'atgaggagccccaagcttactcgatttaacgcccgcagcctcgccaaaccaccaaacacacca'
>>>[[m.start(),m.end()] for m in re.finditer(r'(?=gatttaacg)',sequence)]
out: [[22,22]]
Run Code Online (Sandbox Code Playgroud)
如您所见,start()和end()方法给出了相同的值.我之前注意到了这一点,并且最终使用了m.start()+len(query_sequence),而不是m.end(),但我很困惑为什么会发生这种情况.
我有一个大的日志文件,我想在两个字符串之间提取多行字符串:start和end.
以下是来自以下的示例inputfile:
start spam
start rubbish
start wait for it...
profit!
here end
start garbage
start second match
win. end
Run Code Online (Sandbox Code Playgroud)
应打印所需的解决方案:
start wait for it...
profit!
here end
start second match
win. end
Run Code Online (Sandbox Code Playgroud)
我尝试了一个简单的正则表达式,但它返回了所有内容start spam.该怎么做?
编辑:有关实际计算复杂性的其他信息:
我努力了
re.findall(r'(\d\*\*\d)','3*2**3**2*5**4**')
Run Code Online (Sandbox Code Playgroud)
输出是['2**3', '5**4']. 我想要的输出是['2**3','3**2', '5**4']. 重新需要什么改变?
我的要求很简单,但我就是不知道如何达到它。
这是原始字符串ACCCTNGGATGTGGGGGGATGTCCCCCATGTGCTCG,我想找出所有仅由 组成[ACGT]、以 结尾ATGT且长度至少为 8 的子字符串。我期望的是:
GGATGTGGGGGGATGT
GGATGTGGGGGGATGTCCCCCATGT
Run Code Online (Sandbox Code Playgroud)
使用以下代码:
import re
seq = 'ACCCTNGGATGTGGGGGGATGTCCCCCATGTGCTCG'
matches = re.findall("[ACGT]{4,}ATGT", seq)
if matches:
for match in matches:
print(match)
Run Code Online (Sandbox Code Playgroud)
我只得到了
GGATGTGGGGGGATGTCCCCCATGT
Run Code Online (Sandbox Code Playgroud)
较短的那一个不见了。然后我意识到re.findall不允许重叠。我从如何使用正则表达式查找所有重叠匹配中找到了这个解决方案,然后我将代码修改为:
matches = re.findall("(?=([ACGT]{4,}ATGT))", seq)
Run Code Online (Sandbox Code Playgroud)
然后我得到:
GGATGTGGGGGGATGTCCCCCATGT
GATGTGGGGGGATGTCCCCCATGT
ATGTGGGGGGATGTCCCCCATGT
TGTGGGGGGATGTCCCCCATGT
GTGGGGGGATGTCCCCCATGT
TGGGGGGATGTCCCCCATGT
GGGGGGATGTCCCCCATGT
GGGGGATGTCCCCCATGT
GGGGATGTCCCCCATGT
GGGATGTCCCCCATGT
GGATGTCCCCCATGT
GATGTCCCCCATGT
ATGTCCCCCATGT
TGTCCCCCATGT
GTCCCCCATGT
TCCCCCATGT
CCCCCATGT
CCCCATGT
Run Code Online (Sandbox Code Playgroud)
然后我意识到这个搜索是从右到左开始的。那么我怎样才能要求re.findall从左到右搜索并允许重叠呢?
我想编写一个函数,根据子字符串的最小和最大长度有效地返回字符串的所有可能子字符串的列表。(字符串仅包含大写字母。)
例如,对于 String 'THISISASTRING'、 formin_length=3和max_length=4,它应该返回:
['THI', 'THIS', 'HIS', 'HISI', 'ISI', 'ISIS', 'SIS', 'SISA', 'ISA',
'ISAS', 'SAS', 'SAST', 'AST', 'ASTR', 'STR', 'STRI', 'TRI', 'TRIN',
'RIN', 'RING', 'ING']
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种比我目前的解决方案快得多的解决方案:
import cProfile
random_english_text = \
'AHOUSEISABUILDINGTHATISMADEFORPEOPLETOLIVEINITISAPERMANENTBUILDINGTHATISMEANTTOSTAYSTANDINGITISNOTEASILYPACKEDU' \
'PANDCARRIEDAWAYLIKEATENTORMOVEDLIKEACARAVANIFPEOPLELIVEINTHESAMEHOUSEFORMORETHANASHORTSTAYTHENTHEYCALLITTHEIRHO' \
'MEBEINGWITHOUTAHOMEISCALLEDHOMELESSNESSHOUSESCOMEINMANYDIFFERENTSHAPESANDSIZESTHEYMAYBEASSMALLASJUSTONEROOMORTH' \
'EYMAYHAVEHUNDREDSOFROOMSTHEYALSOAREMADEMANYDIFFERENTSHAPESANDMAYHAVEJUSTONELEVELORSEVERALDIFFERENTLEVELSAHOUSEI' \
'SSOMETIMESJOINEDTOOTHERHOUSESATTHESIDESTOMAKEATERRACEORROWHOUSEACONNECTEDROWOFHOUSES'
def assemble_substrings(textstring, length_min, length_max):
str_len = len(textstring)
subStringList = []
idx = 0
while idx <= str_len - length_min:
max_depth = min(length_max, str_len - idx)
for i in list(range(length_min, max_depth + 1)):
subString = …Run Code Online (Sandbox Code Playgroud) 我有一个正则表达式,可以多种重叠的方式匹配字符串.但是,它似乎只捕获字符串中的一个可能的匹配,我如何获得所有可能的匹配?我试过finditer没有成功,但也许我错了.
我正在尝试解析的字符串是:
foo-foobar-foobaz
Run Code Online (Sandbox Code Playgroud)
我正在使用的正则表达式是:
(.*)-(.*)
>>> s = "foo-foobar-foobaz"
>>> matches = re.finditer(r'(.*)-(.*)', s)
>>> [match.group(1) for match in matches]
['foo-foobar']
Run Code Online (Sandbox Code Playgroud)
我想要比赛(foo和foobar-foobaz),但它似乎只得到(foo-foobar和foobaz).
给定一个字符串"8584320342564023450211233923239923239110001012346596",如何获得所有连续的4位数子序列?
例如,上面的字符串会产生:8548,5843,8432, 0342,...
可能重复:
Python正则表达式找到所有重叠匹配?
我不明白为什么python的re.findall在下面的例子中没有返回所有找到的子串.有任何想法吗?
>>> import re
import re
>>> t='1 2 3'
t='1 2 3'
>>> m=re.findall('\d\s\d',t)
m=re.findall('\d\s\d',t)
>>> m
m
['1 2']
Run Code Online (Sandbox Code Playgroud)
但预期的结果是m = ['1 2','2 3'].
有关信息,我使用的是python 2.6.1.谢谢.
因此,如果我在 python (3.7) 中创建一个如下所示的程序:
import re
regx = re.compile("test")
print(regx.findall("testest"))
Run Code Online (Sandbox Code Playgroud)
并运行它,然后我会得到:
["test"]
Run Code Online (Sandbox Code Playgroud)
即使有两个“测试”实例,它也只向我展示了一个,我认为这是因为第二个“测试”中使用了第一个“测试”中的字母。我怎样才能制作一个程序来["test", "test"]代替我?