正则表达式查找两个标记之间的字符串,同时排除标记和开始标记与结束标记相同

时间:2011-08-28 18:12:26

标签: regex

Regular Expression to find a string included between two characters, while EXCLUDING the delimiters

的扩展名

该问题的解决方案稍作修改:

(?<=\#)(.*?)(?=\#)

给出一个字符串#34; #iPhone 4#由#apple#。&#34;该解决方案返回:

[&#34; iPhone 4&#34;,&#34;由&#34;,&#34; apple&#34;]

制作

现在我不确定这是否只能使用正则表达式,但在这种情况下&#34;是由&#34;不应该被退回。它只是在另外两个##包裹的字符串之间被压扁,所以它自己被包裹。

澄清:正则表达式需要在父字符串中支持可变数量的#foo#字符串。不会总是只有2个。

更新

由于反应各种各样,并且认识到这个问题在没有正则表达式的情况下更容易解决,我投票结束了这个问题。答:使用您选择的语言,不使用正则表达式执行此操作。

6 个答案:

答案 0 :(得分:1)

非常接近@Gerben,但对我来说工作:(在令牌之前应该有一些奇怪的'#'(包括启动令牌的'#'))

(?<=^[^#]*#([^#]*#[^#]*#)*)([^#]*)(?=#)

在处理之前,你不能只取(?<=\#)(.*?)(?=\#)并忽略匹配列表中的所有其他匹配??

答案 1 :(得分:0)

而不是.*使用[^\]*](如果]是dellimeter

<强> EDITED

所以你有一个列表#text#,#text#,..并想要解析列表项

(\#[^\#]*\#[,$])+

答案 2 :(得分:0)

解决方案不会返回你所说的内容(它正在使用方括号而不是哈希标记),但这是你在括号中加入的问题;括号是指导捕获的原因。

#([^#]*)#[^#]*#([^#]*)#

答案 3 :(得分:0)

我对正则表达式不够熟悉,无法为您提供正则表达式答案。但似乎你的列表中的每一项都要被丢弃。为什么不迭代列表并做到这一点?

我就是这样做的:

text = "The #iPhone 4# is made by #apple#" 
cleanlist = list(match.strip('#') for match in re.findall('#.*?#', text, re.UNICODE))
print cleanlist
>>> ['iPhone 4', 'apple']

答案 4 :(得分:0)

不确定这是否有效,但想法是它只匹配第一个#如果前面有偶数#字符。

(?<=(?:^[^#]*#[^#]*#)*#)([^#]*)(?=#)

但是你使用的语言是什么?因为不使用正则表达式会更容易做到

答案 5 :(得分:0)

零宽度断言导致匹配在所有分隔符之间包含文本,而不是在每个“消耗”分隔符后继续。您必须更改执行匹配的代码,以便它提取(例如)第一个捕获组,而不是整个匹配的表达式。如果您发布了现在使用的代码,这将有所帮助,所以我们可以告诉您如何修改它,但您的示例是以Pythonesque方式格式化的,所以像这样;

stringlist = re.findall("#([^#]*)#", string)

抱歉,不是在我的电脑上,而且我的Python不是很好,所以我可能不得不回复你。

更新:修复并大大简化了代码