我正在尝试提取括号中的最后一条语句。但是,我的代码返回括号中的每个语句以及之间的所有内容。
例如:“你[正在]做什么?”
我想要'[正在做“',但是当我运行re.search时,我回来了'[你正在做[正在做]”。
我使用正则表达式运行re.search,该表达式应该获得括号(加上括号)中的最后一条语句,而没有其他内容。我还尝试在开始时添加\ s +,希望可以解决此问题,但是没有。
string = '[What] are you [doing]'
m = re.search(r'\[.*?\]$' , string)
print(m.group(0))
我应该回来[做],但是我会得到整个字符串。
答案 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]'
如果没有匹配项,它将像其他所有答案一样抛出错误,因此您将不得不使用try
和except
答案 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])