Python 检查字符串变体是否在字符串中
我应该注意,我们只允许使用内置的python字符串函数和循环函数 A='bet[bge]geee[tb]bb' B='betggeeetbb' 方括号表示括号内的任何一个字符都可以使用,因此您可以Python 检查字符串变体是否在字符串中,python,string,Python,String,我应该注意,我们只允许使用内置的python字符串函数和循环函数 A='bet[bge]geee[tb]bb' B='betggeeetbb' 方括号表示括号内的任何一个字符都可以使用,因此您可以 下注bgeeetbb 下注ggeeetbb 下注egeeetbb 下注bgeeebbb 下注ggeeebbb 下注egeeebbb 如何检查A是否有一个可在B中找到的组合。 A可以有任意数量的方括号,每个方括号中最少2个字符,最多4个字符 谢谢请仔细阅读。解决方案实际上是re.match函数,其文档包
b
geeet
bbg
geeet
bbe
geeet
bbb
geeeb
bbg
geeeb
bbe
geeeb
bbre.match
函数,其文档包括以下内容:
[]
用于指示一组字符。一组:
- 可以单独列出字符,例如,[amk]将匹配“a”、“m”或“k”
“\n”
表示换行符),因此在匹配字符串中是惯用的
>>> import re
>>> A = r'bet[bge]geee[tb]bb'
>>> B = 'betggeeetbb'
>>> m = re.match(A, B)
>>> m
<_sre.SRE_Match object; span=(0, 11), match='betggeeetbb'>
>>> m.group(0)
'betggeeetbb'
在将此内容随意添加到现有项目之前,请确保您了解:
- 和之间有什么区别
- 创建正则表达式的成本是多少?如果重复使用正则表达式,会产生这样的成本吗
- 您如何选择(例如,示例中由
匹配的字符)[bge]
- 你会怎么表演
把问题分解成更简单的任务是最容易的。有很多方法可以将模式从纯字符串转换为更具结构的模式,但这里有一些方法仅使用纯字符串操作即可开始:
def parse_pattern(pattern):
'''
>>> parse_pattern('bet[bge]geee[tb]bb')
['b', 'e', 't', ['b', 'g', 'e'], 'g', 'e', 'e', 'e', ['t', 'b'], 'b', 'b']
'''
in_group = False
group = []
result = []
# Iterate through the pattern, character by character
for c in pattern:
if in_group:
# If we're currently parsing a character
# group, we either add a char into current group
# or we end the group and go back to looking at
# normal characters
if c == ']':
in_group = False
result.append(group)
group = []
else:
group.append(c)
elif c == '[':
# A [ starts a character group
in_group = True
else:
# Otherwise, we just handle normal characters
result.append(c)
return result
def check_if_matches(string, pattern):
parsed_pattern = parse_pattern(pattern)
# Useful thing to note: `string` and `parsed_pattern`
# have the same number of elements once we parse the
# `pattern`
...
if __name__ == '__main__':
print(check_if_matches('betggeeetbb', 'bet[bge]geee[tb]bb'))
你自己试过什么办法来解决这个问题吗?请出示它,你在找正则表达式then@everyone建议使用正则表达式:正则表达式有很多特性,不仅仅是“方括号中的东西”。除了字符类之外,正确地逃离所有正则表达式元可能比编写非正则表达式更困难。我可以拆分字符串并检查括号前的文本,然后检查括号中的任何可能性,然后检查括号后的文本。但我不确定如何循环它来覆盖n loopsHow你会在没有电脑的情况下进行吗?解决这个问题,将其转化为一个循序渐进的过程,并将其转化为工作代码。您必须使用
re.fullmatch
,或者在正则表达式中添加一个字符串结束锚点$
。另外,请不要使用术语“原始字符串”;它给新手的印象是他们是某种特殊的字符串。请改称它们为“原始字符串文字”。问题是字符串变体是否在另一个字符串中fullmatch
不太合适,甚至可能我关于match
的建议都是错误的。
def parse_pattern(pattern):
'''
>>> parse_pattern('bet[bge]geee[tb]bb')
['b', 'e', 't', ['b', 'g', 'e'], 'g', 'e', 'e', 'e', ['t', 'b'], 'b', 'b']
'''
in_group = False
group = []
result = []
# Iterate through the pattern, character by character
for c in pattern:
if in_group:
# If we're currently parsing a character
# group, we either add a char into current group
# or we end the group and go back to looking at
# normal characters
if c == ']':
in_group = False
result.append(group)
group = []
else:
group.append(c)
elif c == '[':
# A [ starts a character group
in_group = True
else:
# Otherwise, we just handle normal characters
result.append(c)
return result
def check_if_matches(string, pattern):
parsed_pattern = parse_pattern(pattern)
# Useful thing to note: `string` and `parsed_pattern`
# have the same number of elements once we parse the
# `pattern`
...
if __name__ == '__main__':
print(check_if_matches('betggeeetbb', 'bet[bge]geee[tb]bb'))