提取[]的最后一个语句(正则表达式)

时间:2019-08-27 18:41:56

标签: python regex

我正在尝试提取括号中的最后一条语句。但是,我的代码返回括号中的每个语句以及之间的所有内容。

例如:“你[正在]做什么?”

我想要'[正在做“',但是当我运行re.search时,我回来了'[你正在做[正在做]”。

我使用正则表达式运行re.search,该表达式应该获得括号(加上括号)中的最后一条语句,而没有其他内容。我还尝试在开始时添加\ s +,希望可以解决此问题,但是没有。

string = '[What] are you [doing]'

m = re.search(r'\[.*?\]$' , string)

print(m.group(0))

我应该回来[做],但是我会得到整个字符串。

6 个答案:

答案 0 :(得分:1)

re.findall(r'\[(.+?)\]', 'What [are] you [doing]')[-1]

['doing']

答案 1 :(得分:0)

根据条件提取括号中的最后一条语句

import re

s = 'What [are] you [doing]'
m = re.search(r'.*(\[[^\[\]]+\])', s)
res = m.group(1) if m else m
print(res)  # [doing]

答案 2 :(得分:0)

您的正则表达式的次要修复。最后,您不需要$。并且也使用re.findall而不是re.search

import re

string = 'What [are] you [doing]'

re.findall("\[.*?\]", string)[-1]

输出:

'[doing]'

如果您的字符串中有空的[],则上述方法也会将其计入输出中。要解决此问题,请将正则表达式从\[.*?\]更改为\[..*?\]

import re

string = "What [are] you []"

re.findall("\[..*?\]", string)[-1]

输出:

'[are]'

如果没有匹配项,它将像其他所有答案一样抛出错误,因此您将不得不使用tryexcept

答案 3 :(得分:0)

您可以使用findall并获取上一个索引

import re
string = 'What [are] you [doing]'
re.findall("\[\w{1,}]", string)[-1]

输出

'[doing]'

这也适用于@MonkeyZeus在评论中发布的示例。如果最后一个值为空,则不应返回空值。例如

string = 'What [are] you []'

输出

'[are]'

答案 4 :(得分:0)

您可以使用否定超前模式来确保没有另一对方括号跟随匹配的方括号:

1MHG161   M01514GC    PROD  IBM418AGP00106 047806 D89BQD005 TFRVNT    0501B90826214213000A 0201E $13 2TRG240

或者您可以使用re.search(r'\[[^\]]*\](?!.*\[.*\])', string).group() 消耗所有前导字符,直到最后一次匹配:

.*

给出re.search(r'.*(\[.*?\])', string).group(1) ,以上两个代码都将返回:string = 'abc [foo] xyz [bar] 123'

答案 5 :(得分:0)

这会捕获方括号中的段,并且方括号之间有任何内容(不一定是字母或数字:任何符号/空格/等):

#
# Paul Gronke and Paul Manson
# Early Voting Information Center at Reed College
#
# August 27, 2019
#
#
# Code to plot a single coefficient from multiple models, provided
# as an easier alternative to "coefplot" and "dotwhisker". Some users
# may find those packages more capable
#
# Code adapted from https://stackoverflow.com/questions/35582052/plot-regression-coefficient-with-confidence-intervals


# gen_df_plot function will create a tidy data frame for your plot
#   Currently set up to display 95% confidence intervals

gen_df_plot <- function(reg, coef_name){
  df <- data.frame(y = reg$coefficients[[coef_name]],
                   lb = confint(reg, coef_name, level = 0.95)[1],
                   ub = confint(reg, coef_name, level = 0.95)[2])
  return(df)
}

# Populate the data frame with a list of your model results.

df.plot <- lapply(list(model1,      # List your models here
                       model2), 
                  gen_df_plot, 
                  coef_name = 'x1') # Coefficient name

  # Convert the list to a tidy data frame

df.plot <- data.table::rbindlist(df.plot)

# Provide the coefficient or regression labels below, in the
# order that you want them to appear. The "levels=unique(.)" parameter
# overrides R's desire to order the factor alphabetically

df.plot$x <- c("Group 1", 
               "Group 2") %>%
  factor(., levels = unique(.),
         ordered = TRUE)

# Create your plot

df.plot %>% ggplot(aes(x, y)) + 
  geom_point(size=4) +
  geom_errorbar(aes(ymin = lb, ymax = ub), width = 0.1, linetype="dotted") + 
  geom_hline(aes(yintercept=0), linetype="dashed") + 
  theme_bw() +
  ggtitle("Comparing Coefficients") +
  ylab("Coefficient Value")```

给予

import re

string = '[US 1?] Evaluate any matters identified when testing segment information.[US 2!]'

print(re.findall(r'\[[^]]*\]', string)[-1])