【发布时间】:2019-09-14 14:07:14
【问题描述】:
我正在尝试在包含通配符的字符串中查找子字符串的位置。例如:
substring = 'ABCDEF'
large_string = 'QQQQQABC.EFQQQQQ'
start = string.find(substring, large_string)
print(start)
5
提前谢谢你
【问题讨论】:
我正在尝试在包含通配符的字符串中查找子字符串的位置。例如:
substring = 'ABCDEF'
large_string = 'QQQQQABC.EFQQQQQ'
start = string.find(substring, large_string)
print(start)
5
提前谢谢你
【问题讨论】:
我们的想法是将您要查找的内容(在本例中为 ABCDEF)转换为以下正则表达式:
([A]|\.)([B]|\.)([C]|\.)([D]|\.)([E]|\.)([F]|\.)
每个字符都放在[] 中,以防它是一个正则表达式特殊字符。唯一的复杂情况是搜索字符之一是否为^,如ABCDEF^。 ^ 字符应该只是被转义,因此需要特殊处理。
然后您使用re.search 在字符串中搜索该模式:
重新导入
substring = 'ABCDEF'
large_string = 'QQQQQABC.EF^QQQQQ'
new_substring = re.sub(r'([^^])', r'([\1]|\\.)', substring)
new_substring = re.sub(r'\^', r'(\\^|\\.)', new_substring)
print(new_substring)
regex = re.compile(new_substring)
m = regex.search(large_string)
if (m):
print(m.span())
打印:
([A]|\.)([B]|\.)([C]|\.)([D]|\.)([E]|\.)([F]|\.)
(5, 11)
【讨论】:
不确定是否有正则表达式操作,但您可以生成一个可用的正则表达式模式列表。
substring = "ABCDE"
patterns = []
for i in range(len(substring)):
patterns.append(string[:i]+'.?' + string[i:])
这会在我们的示例中为您提供以下输出:
.?abcde
a.?bcde
ab.?cde
abc.?de
abcd.?e
有了这个列表,您现在可以找到索引
for pattern in patterns:
try:
print("Index is" + re.search(pattern,substring).start())
break
excpect AttributeError:
pass
else:
print("Not found")
```python
【讨论】:
我的尝试:
from itertools import combinations
def gen_wild_cards(string):
list_ = []
start_indexes = [i for i in range(len(string))]
for i in range(1, len(string)):
combs = [v for v in combinations(start_indexes, i)]
for c in combs:
new_string = list(string)
for index in c:
new_string[index] = "."
list_.append("".join(new_string))
return list_
large_string = 'QQQQQABC.EFQQQQQ'
basic_string = "ABCDEF"
list_ = gen_wild_cards(basic_string)
for wildcard in list_:
print(large_string.find(wildcard))
基本上我正在生成所有通配符并通过大字符串搜索所有通配符。生成的通配符:
.BCDEF
A.CDEF
AB.DEF
ABC.EF
ABCD.F
ABCDE.
..CDEF
.B.DEF
.BC.EF
.BCD.F
.BCDE.
A..DEF
A.C.EF
A.CD.F
A.CDE.
AB..EF
AB.D.F
AB.DE.
ABC..F
ABC.E.
ABCD..
...DEF
..C.EF
..CD.F
..CDE.
.B..EF
.B.D.F
.B.DE.
.BC..F
.BC.E.
.BCD..
A...EF
A..D.F
A..DE.
A.C..F
A.C.E.
A.CD..
AB...F
AB..E.
AB.D..
ABC...
....EF
...D.F
...DE.
..C..F
..C.E.
..CD..
.B...F
.B..E.
.B.D..
.BC...
A....F
A...E.
A..D..
A.C...
AB....
.....F
....E.
...D..
..C...
.B....
A.....
如果您只对第一场比赛感兴趣,您可以使用带有生成器的惰性方法,而不是一次性生成所有通配符
【讨论】: