【问题标题】:Split or partition string after certain words在某些单词之后拆分或分区字符串
【发布时间】:2018-11-19 12:28:43
【问题描述】:

首先让我说我已经在谷歌上搜索了好几个小时才在这里问这个问题,如果我选择在这里发帖,我会非常绝望。

我有一些格式如下的字符串(近似值):

"firstword text ONE lastword"
"firstword text TWO lastword"

我需要在'firstword' 之后和'ONE''TWO' 之前提取text

所以我对上述字符串的输出必须是:

"text"

如何拆分或分区字符串以便我可以:

  • 删除第一个单词(我已经知道如何用 str.split(' ') 做到这一点)
  • 保留任何“ONE”或“TWO”之前的文本。 (我认为它应该看起来像 str.split('ONE' | 'TWO'),但这显然不起作用,我还没有设法找到 立即解决。

如果可能的话,我想用split()partition() 解决它,但正则表达式也可以。

感谢您的帮助,如果这是一个愚蠢的问题,我们深表歉意。

【问题讨论】:

标签: python regex string split


【解决方案1】:

您可以使用此正则表达式,它会进行正向前瞻和正向后视,

(?<=firstword)\s*(.*?)\s*(?=ONE|TWO)

Demo

说明:

  • (?&lt;=firstword) --> 正向向后看,确保匹配的文本后跟第一个单词
  • \s* --> 吃掉任何空白
  • (.*?) --> 捕获您的预期数据
  • \s* --> 吃掉任何空白
  • (?=ONE|TWO) --> 正向前瞻以确保匹配的文本后跟 ONE 或 TWO

【讨论】:

  • 这确实是一个很好的解决方案。我会接受它作为答案,因为它解决了我的具体查询。不过,这确实让我想知道如何使用split()partition() 解决这个问题。有可能吗?
【解决方案2】:

当你用空格分割它时,你有一个所有单词的列表,然后你可以选择你想要的单词:

s = "firstword text TWO lastword"
l = s.split(" ") # l = ["firstword" , "text" , "TWO" , "lastword"]
print l[1] # l[1] = "text"

s = "firstword text TWO lastword"
print s.split(" ")[1]

【讨论】:

  • 这个问题是我的字符串在ONETWO 之后可以有任意长度。我正在寻找删除ONETWO 之后的所有内容,可能是1 个字或10 个字。抱歉没有更具体。我正在使用的字符串的一个更现实的例子是firstword text ONE extra text which needs to be deleted
【解决方案3】:

试试这个

str_list = ["firstword text ONE lastword","firstword text TWO lastword","any text u entered before firstword text ONE","firstword text TWO any text After"]
end_key_lst = ['ONE','TWO']
print map(lambda x:x.split('firstword')[-1].strip(),[''.join(val.split(end_key)[:-1]) for val in str_list for i,end_key in enumerate(end_key_lst) if end_key in val.split()])

Result:['text', 'text', 'text', 'text']

我如何做到这一点: 愿你有很多这样的字符串,所以我将它们保存在列表中,并将我们的结束键排列为一个,两个在一个列表中。 我使用列表压缩和映射函数来获取我们想要的目标列表。

【讨论】:

    【解决方案4】:

    你可以像这样使用正则表达式:

    import re
    string = "firstword text TWO lastword"
    re.search('firstword\s+(\w+)\s+[ONE|TWO]', string).group(1)
    'text'
    

    【讨论】:

      【解决方案5】:

      其实没有必要使用正则表达式。您可以将所需的分隔符存储到列表中,然后检查它们是否存在。

      orig_text = "firstword text ONE lastword"
      
      first_separator = "firstword"
      #Place all "end words" here
      last_separators = ["ONE", "TWO"]
      
      output = []
      
      #Splitting the original text into list
      orig_text = orig_text.split(" ")
      
      #Checking if there's the "firstword" just in case
      if first_separator in orig_text:
          #Here we check if there's "ONE" or "TWO" in the text
          for i in last_separators:
              if i in orig_text:
                  #taking everything between "firstword" and "ONE"/"TWO"
                  output = orig_text[orig_text.index(first_separator)+1 : orig_text.index(i)]
                  break
      
      #Converting to string
      output = " ".join(output)
      
      print(output)
      

      这是一个输出示例:

      "firstword text TWO lastword" -> "text"
      "firstword hello world ONE" -> "hello world"
      "first text ONE" -> ""
      "firstword text" -> ""
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-02
        • 1970-01-01
        • 1970-01-01
        • 2012-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多