【问题标题】:Python: Dynamic matching with regular expressionsPython:使用正则表达式进行动态匹配
【发布时间】:2020-08-30 07:34:30
【问题描述】:

我一直在尝试几种方法来在正则表达式中使用变量。似乎没有人能够满足我的需求。

我想在字符串(例如“barbarfoofoofoobarbarbar”)中搜索连续重复的子字符串(例如 foofoofoo)。但是,我需要重复子字符串 (foo) 和重复次数(在本例中为 3)都是动态的,包含在变量中。由于重复的正则表达式是re{n},这些花括号与我放在字符串中的变量冲突,因为它们也需要花括号。

代码应该匹配 foofoofoo,但不能匹配 foo 或 foofoo。

我怀疑我需要使用某种字符串插值。

我尝试过类似的东西

n = 3
str = "foo"
string = "barbarfoofoofoobarbarbar"
match = re.match(fr"{str}{n}", string)

match = re.match(fr"{str}{{n}}", string)

或转义

match = re.match(fr"re.escape({str}){n}", string)

但这些似乎都不起作用。有什么想法吗?两条信息都是动态的,而且它只匹配连续的东西,这一点非常重要。也许我可以使用 findall 或 finditer?不知道如何继续。

我根本没有尝试过的东西不是使用正则表达式,而是类似

if (str*n) in string:
    match

我不知道这是否可行,但如果我需要正则表达式的额外功能,我希望能够使用它。

【问题讨论】:

  • this 回答你的问题了吗?
  • match() 仅匹配字符串的开头。所以即使你弄清楚了转义,你仍然不会得到匹配 (foo){3} 这很丑但匹配:match = re.search(fr"({s}){{{n}}}", string) (使用双括号作为文字括号)。
  • 遗憾的是,事实并非如此,因为在这种情况下,他不必在正则表达式中使用花括号。我检查了其他问题,没有一个有效。
  • 实际上有一个部分叫做“大括号”。也许我错过了什么。
  • @LuiMartinezLaskowski 您需要大括号为 f 字符串插入变量,但您还需要双大括号将文字大括号字符放入正则表达式的字符串中。您可以只查看由正则表达式上下文之外的变体创建的字符串。

标签: python regex variables dynamic match


【解决方案1】:

对于字符串barbarfoofoofoobarbarbar,如果您想捕获foofoofoo,正则表达式将为r"(foo){3}"。如果你想动态地做到这一点,你可以做fr"({your_string}){{{your_number}}}"

如果您想在 f 字符串中使用花括号,请使用 {{}},它将按字面意思打印为 {}

另外,str 不是一个好的变量名,因为str 是一个类(字符串类)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 2021-10-23
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    相关资源
    最近更新 更多