在字符串中查找元素并进行更智能的操作

时间:2018-04-04 13:54:24

标签: python

我有一个字符列表

Page not found (404)
Request Method:     GET
Request URL:    http://localhost:8000/balance/2018/04/02

Using the URLconf defined in spendings_calculator.urls, Django tried these URL patterns, in this order:

    admin/
    balance/ [name='index']
    balance/ <int:year>/<int:month:>/<int:day>/ [name='show_day']
    balance/ <int:year>/<int:month>/ [name='show_month']
    balance/ <int:year>/ [name='show_year']

The current path, balance/2018/04/02, didn't match any of these.

我有一些话。

a = ["s", "a"]

我知道列表中的字符只能出现一次或按线性顺序出现(或者最小的出现在较大的字符集中)。

我想通过将元素放在中间,其余部分放在左边或右边来分割我的单词(如果没有任何内容则放一个“=”)

所以b = "asp" c= "lat" d = "kasst"

如果包含

的更大字符集
b = ["*", "as", "p"]

我知道这些组合最多可以是4个长度。

所以我根据长度划分了可能的组合:

d = ["k", "ass", "t"]

对于每个c,从更大的开始 为简单起见,假设我在这种情况下以c3开头而不是长度为4.

我必须用大量数据来做这件事。

有没有办法简化代码?

3 个答案:

答案 0 :(得分:1)

我会做一个正则表达式来简化匹配。

import re

splitters = ''.join(a)
pattern = re.compile("([^%s]*)([%s]+)([^%s]*)" % (splitters, splitters, splitters))
words = [v if v else '=' for v in pattern.match(s).groups() ]

这不允许第一个或最后一个组中的字符,因此并非所有字符串都能正确匹配(并抛出异常)。如果你愿意,你可以允许它们。您可以随意修改正则表达式,以更好地匹配您希望它执行的操作。

此外,您只需要运行一次re.compile,而不是每次尝试匹配的字符串。

答案 1 :(得分:1)

使用正则表达式?

import re
a = ["s", "a"]
text = "kasst"
pattern = re.compile("[" + "".join(a) + "]{1,4}")
match = pattern.search(text)
parts = [text[:match.start()], text[match.start():match.end()], text[match.end():]]
parts = [part if part else "*" for part in parts]

但请注意,如果

中的元素不匹配,则不会处理此情况

答案 2 :(得分:1)

您可以使用正则表达式执行类似的操作:

>>> import re
>>> p = re.compile(r'([sa]{1,4})')

p匹配字符's'或'a'重复1到4次。

要以此模式拆分给定字符串,请使用p.split。在模式中使用捕获括号会导致模式本身包含在结果中。

>>> p.split('asp')
['', 'as', 'p']
>>> p.split('lat')
['l', 'a', 't']
>>> p.split('kasst')
['k', 'ass', 't']