[英]Can't find the correct regex syntax to match newline or end of string
这感觉就像一个非常简单的问题,但我无法在任何地方找到答案。
(注意:我使用的是Python,但这不重要。)
说我有以下字符串:
s = "foo\nbar\nfood\nfoo"
我只是试图找到一个匹配“foo”两个实例的正则表达式,而不是“食物”,基于“食物”中的“foo”不会立即跟在换行符或结束时串。
这可能是表达我的问题的一种过于复杂的方式,但它提供了一些具体的工作方式。
以下是我尝试过的一些结果(注意:我想要的结果是[ foo\\n
, foo
]):
foo[\\n\\Z]
=> [ 'foo\\n'
]
foo(\\n\\Z)
=> [ '\\n'
, ''
] <=这似乎与换行符和EOS匹配,但不是foo
foo($|\\n)
=> [ '\\n'
, ''
]
(foo)($|\\n)
=> [( foo
, '\\n'
),( foo
, ''
)] <=几乎就在那里,这是一个可用的计划B,但我想找到完美的解决方案。
我发现唯一有用的是:
foo$|foo\\n
=> [ 'foo\\n'
,`'foo']
这对于这样一个简单的例子来说很好,但很容易看出它如何变得难以用一个更大的表达式(是的,这个foo
东西是我实际使用的更大表达式的代表)。
有趣的是:我能找到的最接近的问题是这个问题: 在正则表达式中,匹配字符串的结尾或特定的字符
在这里,我可以简单地用\\n
代替我的“特定角色”。 现在,接受的答案使用regex /(&|\\?)list=.*?(&|$)/
。 我注意到OP使用的是JavaScript(问题是用javascript
标签标记的),所以也许JavaScript正则表达式解释器不同,但是当我在Python中使用上述正则表达式中的问题中给出的确切字符串时,我得到的结果很糟糕:
>>> findall("(&|\?)list=.*?(&|$)", "index.php?test=1&list=UL")
[('&', '')]
>>> findall("(&|\?)list=.*?(&|$)", "index.php?list=UL&more=1")
[('?', '&')]
所以,我很难过。
您可以使用re.MULTILINE
并在模式中的$
之后包含可选的换行符:
s = "foo\nbar\nfood\nfoo"
pattern = re.compile('foo$\n?', re.MULTILINE)
print re.findall(pattern, s)
# -> ['foo\n', 'foo']
如果你只关心foo
:
In [42]: import re
In [43]: strs="foo\nbar\nfood\nfoo"
In [44]: re.findall(r'\bfoo\b',strs)
Out[44]: ['foo', 'foo']
\\b
表示单词边界:
\\b
匹配空字符串,但仅匹配单词的开头或结尾。 单词被定义为字母数字或下划线字符的序列,因此单词的结尾由空格或非字母数字的非下划线字符表示。 请注意,正式地,\\ b被定义为\\ w和\\ W字符之间的边界(反之亦然),或者在\\ w和字符串的开头/结尾之间,因此被认为是字母数字的精确字符集取决于关于UNICODE和LOCALE标志的值。 例如,r'\\ bfoo \\ b'匹配'foo','foo。','(foo)','bar foo baz'但不匹配'foobar'或'foo3'。 在字符范围内,\\ b表示退格符,以便与Python的字符串文字兼容。
( 来源 )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.