我正在寻找一个单一的正则表达式,它将匹配任何包含" new"那么这个词" ee"非字边界。下面是我在非字边界之前或之后放置的任何内容返回False的代码。
from PIL import Image
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
def generate_pdf(c):
"""
letter :- (612.0, 792.0)
"""
im = Image.open("so.png")
c.drawInlineImage(im, 256, 720, width=100, height=60)
c = canvas.Canvas("report_image.pdf", pagesize=letter)
generate_pdf(c)
c.save()
答案 0 :(得分:1)
^.*?\\bnew\\s\\S*\\Bee\\B.*$
你可以尝试一下。参见演示。
https://regex101.com/r/cK4iV0/19
这将匹配单词new
,然后ee
与word boundary
不匹配。
答案 1 :(得分:1)
以下解释了为什么这些测试会产生这些结果:
System.out.println(sa.matches(".*\\s\\bnew\\b\\sfre.*")); //True
this is new freeCode
包含something
+ whitespace
+ word boundary
+ new
+ word boundary
+ whitespace
+ fre
+ something
。 Word边界在n
和w f
之间匹配。
System.out.println(sa.matches(".*\\s\\Bee\\B\\s.*")); //False
\B
与\s
之间的非字边界e
无法匹配,因为e
是一个字符。因此,没有匹配。
System.out.println(sa.matches(".*\\Bee\\B.*")); //True
\B
之间的非单词边界e
匹配,因为e
中的freecode
不在单词边界位置(它位于2个字母,单词字符之间),最后e
后面再跟一个字母(在这种情况下为c
)。这是一个有效的匹配。
要启用这两个检查,您需要组合第一个和第三个正则表达式模式。您不需要\s\b
和\b\s
。如果您只想匹配整个单词new
,请删除\s
:
System.out.println(sa.matches(".*\\bnew\\b.*\\Bee\\B.*"));
如果您需要匹配new
周围的空格,请使用:
System.out.println(sa.matches(".*\\snew\\s.*\\Bee\\B.*"));