我的问题标题可能不清楚,因此我将尝试通过一些示例进行解释以更好地解释
我才刚刚开始使用正则表达式,并且想用它来匹配每n个字符中另一个字符串中出现(隐藏)的字符串,例如:
我们要在此字符串中找到世界“ hello”:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) {
// build the root
var configRoot = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false)
// ...
.Build();
var builder = new WebHostBuilder();
return builder
// reuse the configRoot
.UseConfiguration(configRoot)
// register the configRoot as a singleton service
.ConfigureServices(services =>{
services.AddSingleton<IConfigurationRoot>(configRoot);
})
.UseStartup<Startup>()
.ConfigureLogging(logging => {
//override configuration in NLog.config
logging.ClearProviders();
logging.SetMinimumLevel(LogLevel.Trace);
})
.UseKestrel();
}
注意它如何每2个字符重复一次
我能够为此创建一个简单的正则表达式规则:
"h..e..l..l..o......"
但是此方法每2步只能使用一次,但我希望它能执行任意数量的步长(或至少说5步),这样它也可以匹配以下字符串:
"h.{2}e.{2}l.{2}l.{2}o"
我尝试过的事情:
"h...e...l...l...o"
但是,这不能在所有范围内固定数字,因此,即使该字符串未按固定间隔出现,该字符串仍会通过:
"h.{1,5}e.{1,5}l.{1,5}l.{1,5}o"
请注意2个l之间的单个字符。我在这里的唯一另一个想法是使用循环说出1到5并尝试将所有这些作为单独的regex语句进行尝试,但是想尝试在这里询问是否有任何整齐的方法可以使用regex进行操作: )
谢谢您的回复
答案 0 :(得分:3)
我建议为此使用捕获组和后向引用
h(\.{1,5})e\1l\1l\1o
第一个字母(\.{1,5})
之后的h
将匹配1到5个点,并捕获在组#1中。之后,我们在每个字符之间使用反向引用#1,即\1
,以确保我们在所有字母之间匹配相同数量的点。
答案 1 :(得分:0)
如果您只想从文本中提取字母,并且它是一个单词,请尝试''.join(re.findall(r"[a-zA-Z]",text))
。