【问题标题】:Is it possible to use substrings without having to store them in a seperate variable是否可以使用子字符串而不必将它们存储在单独的变量中
【发布时间】:2018-08-01 17:06:13
【问题描述】:

我希望能够检查字符串中的第一个子字符串:random_string = "fox is bright orange" 是什么,而无需拆分字符串然后从列表中读取,或者将其存储为其他变量。是否有可能做到这一点?

我在这里使用的字符串只是一个例子,所以没有使用指定的字符串。我希望能够找出 any 字符串的子字符串(如果它被' ' 分割)而不必使用列表

【问题讨论】:

  • 第一个子串是什么意思?
  • 为什么,你为什么不想使用列表?
  • 为什么要尽量减少使用的变量数量?你能举一个你认为有太多变量的代码的例子吗?
  • 这个问题是X-Y problem,如果我见过的话!
  • @DanielPryden Op 对处理整个字符串的担忧是正确的,如果他需要一百万个字母字符串中的前三个字母(如果这是唯一的问题)。我当然不能说剩下的问题,我不知道。

标签: python string


【解决方案1】:

所以你想从fox is bright orange得到fox

  1. 正则表达式; ^\w+ 从开头获取一个或多个字母数字:

    In [61]: re.search(r'^\w+', random_string).group()
    Out[61]: 'fox'
    
  2. str.partition(产生一个元组)并获取第一个元素

    In [62]: random_string.partition(' ')[0]
    Out[62]: 'fox'
    

【讨论】:

  • 您能解释一下正则表达式的工作原理吗?我有点迷茫
  • @exemplarary 添加了解释。
【解决方案2】:

您是否要检查给定的字符串是否以某个单词开头?

random_string = "fox is bright orange"
print(random_string.startswith("fox ")   # True

要获取第一个单词的长度吗?

random_string = "fox is bright orange"
print(random_string.index(" "))           # 3

你想得到第一个词,但不分割其他任何东西吗?

random_string = "fox is bright orange"
print(random_string[:random_string.index(" ")])    # fox

请注意,str.index() 在找不到指定的子字符串时引发ValueError,即当字符串中只有一个单词时,因此如果您使用最后两种解决方案之一,您应该捕获该错误并执行一些操作适当的(例如使用整个字符串)。

random_string = "fox is bright orange"
try:
    print(random_string[:random_string.index(" ")])
except ValueError:
    print(random_string)

或者您可以使用str.find() 代替。当未找到子字符串时,这将返回 -1,您必须稍作不同的处理。

【讨论】:

  • 请注意,如果有人想在不处理错误的情况下执行此操作(无论出于何种原因),这应该可以random_string[:(random_string + " ").index(" ")](在搜索的末尾添加一个空格)。
  • 我试图避免创建新字符串,因为这似乎很重要,但你说得对,我经常使用这种方法。
  • 您当然是对的,因为创建新字符串的成本很高。这种方法更适合“我喜欢小巧、聪明的 Python 单线”的人。在某些情况下这仍然是合法的:)
【解决方案3】:

在 Python 中做你想做的事的正确方法正是你想要避免的。没有真正的理由这样做。

但是...如果您绝对想避免使用列表,您可以这样做。

sub_string = random_string[:random_string.index(' ')]

请注意,如果您的字符串中没有空格,这将引发异常。

【讨论】:

  • 我想如果字符串恰好是大英百科全书,那么可以避免使用该列表。
  • 我认为在内存中加载一个 4gb 的字符串然后从中列出一个列表没有任何问题。
【解决方案4】:

你可以使用切片:

In [1]: s = "fox is bright orange"

In [2]: s[4:7]
Out[2]: 'is '

In [3]: s[4:13]
Out[3]: 'is bright'

In [4]: s[4:]
Out[4]: 'is bright orange'

In [6]: s[:6]
Out[6]: 'fox is'

在较低级别的语言(如 C)中,您可以在原始字符串上使用具有任意性的指针。因此,您可以使用切片复制此行为。但是请注意,python 无论如何都会返回一个副本,因为 python 字符串是不可变的。

【讨论】:

  • 有没有办法做到这一点,这样我就不需要知道字符串的大小来确定我需要什么。因为字符串会有所不同,并且不会使用相同的字符位置
  • 您能否提供一个示例输入和所需的输出?因为有很多方法可以做到这一点,而您的问题还不够清楚。请编辑。
【解决方案5】:

如果您不想使用 re,那么在 random_string 上进行简单迭代怎么样?

def get_first_word(long_string):
    offset = 0
    while long_string[offset] !=" ":
        offset+=1

    return long_string[0:offset]

所以运行这段代码:

random_string = "fox is bright orange"
print(get_first_word(random_string))

将打印 - fox

【讨论】:

    【解决方案6】:

    这个

    ''.join(iter(iter(s).__next__, ' '))
    

    无论您的字符串中是否实际存在' ',都可以使用。

    【讨论】:

      猜你喜欢
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 2021-03-27
      • 1970-01-01
      • 2022-01-03
      • 2015-05-07
      • 1970-01-01
      相关资源
      最近更新 更多