【问题标题】:Get a word between得到一个词之间
【发布时间】:2018-08-24 09:49:54
【问题描述】:

假设我有这样的字符串:

他说“我是他的父亲。”

那个漂亮的女士说“拿你的书!”

绿色纹身的女孩说:“你在做什么?”

我试图从上面的句子中得到“说”这个词。

这是我目前所拥有的:

def between(value, a, b):
    # Find and validate before-part.
    pos_a = value.find(a)
    if pos_a == -1: return ""
    # Find and validate after part.
    pos_b = value.rfind(b)
    if pos_b == -1: return ""
    # Return middle part.
    adjusted_pos_a = pos_a + len(a)
    if adjusted_pos_a >= pos_b: return ""
    return value[adjusted_pos_a:pos_b]

print(between(test, [0], '"'))

我使用上面的代码,它给了我

TypeError: 无法将 'list' 对象隐式转换为 str

【问题讨论】:

  • 你想根据什么标准得到said这个词?你想得到引用部分之前的最后一个词吗?
  • a 是一个列表,所以字符串 test 将永远无法找到它
  • 我不明白你的目的是什么。如果你知道你只想要 said 这个词,为什么不直接输入 return "said" 呢?
  • 投票结束,因为“不清楚要问什么”。
  • @Sнаđошƒаӽ 关闭它是朝着删除它迈出的一步。

标签: python string


【解决方案1】:

正如每个人都解释了你的错误信息,我会建议一种不同的方法。

您可以使用列表推导。

def return_word(sentence, word):
    if word in sentence.split():
        return [i for i in sentence.split() if i == word][0]
    else:
        return ''
print(return_word('sample sentence', 'sentence'))

此代码将获得您所需要的。尽管您的要求似乎不清楚,但我希望您对此有所了解。

干杯!

【讨论】:

  • 如果a 里面没有“说”怎么办?由于 OP 试图在测试字符串中找到“said”,我猜也会出现这样的情况,即句子中不存在“said”这个词。
  • @Sнаđошƒаӽ 现在可以了吗?
  • @SyafiqurRahman 下次请详细说明您的要求,因为您很快就会得到所需的。
  • @SmashGuy 抱歉,没有。我的观点是,问题本身的规定非常不明确。那么,对于一个最初没有意义的问题的答案有什么意义呢?没有,对吧?希望你明白我为什么说“不”;-)
  • @Sнаđошƒаӽ 我明白你的意思。但我更愿意回答他,因为我明白他想问什么。虽然这对我们来说没有多大意义,但对于他的计划来说,这可能是一个更大的部分。放轻松!
【解决方案2】:

如果你想得到引用句子之前使用的单词,你可以使用"分割,然后使用空格' '分割,如下例所示:

test = 'That pretty lady said "Get your book!"'
test.split('"')[0].split(' ')[-2]

【讨论】:

  • 请避免回答不明确的问题。如果这个问题没有意义,那么它的答案又有什么意义呢?
  • 抱歉,我不是故意制造问题的。我只是根据评论“你想在引用部分之前得到最后一个词吗?”回答,他回答是。我会留下它作为评论,但我还没有解锁这个“功能”
【解决方案3】:

我将你的 between 重命名为 word_before

def word_before(text, char_after):
    return text.split(char_after, maxsplit=1)[0].split(" ")[-2]

将它与您的测试字符串一起使用:

>>> tests = [
...     'He said "I am his father."',
...     'That pretty lady said "Get your book!"',
...     'The girl with the green tatoo said "What are you doing?"',
... ]
>>>
>>> for text in tests: print(word_before(text, '"'))
...
said
said
said

它是如何工作的? 第一次拆分会在给定字符处将您的字符串分成两半,然后停止搜索(这就是我们使用 maxsplit=1 的原因)。 第二次拆分会将文本拆分为单词(每个空格),我们采用倒数第二项,因为最后一项实际上只是一个空字符串''。 然后我们返回这个结果。

如果您想进一步改进这一点,您可以添加一个try-except-block 检查 IndexError,这表明它没有找到任何匹配项。

例如,您可以按照这些思路做一些事情

def word_before(text, char_after):
    parts = text.split(char_after, maxsplit=1)
    if len(parts) <= 1:
        return ''  # No match

    try:
        match = parts[0].split(" ")[-2]
    except IndexError:
        return '' # No word before

    return match

如果不匹配会给出以下结果

>>> word_before("No quote here", '"')
''

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 2021-07-10
    • 2011-06-28
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多