Python re.escape和r'\ b'给出了意想不到的结果

时间:2017-07-17 13:29:37

标签: python regex

我想要匹配短语import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.RowFilter; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableRowSorter; public class example extends JPanel { private String[] columnNames = { "Volume" }; private Object[][] data = { {new Integer(5)}, {new Integer(1)}, {new Integer(2)}, {new Integer(3)}, {new Integer(5)}, {new Integer(5)}, {new Integer(7)} }; private DefaultTableModel myModel = new DefaultTableModel(data, columnNames); private JTable table = new JTable(myModel); private JScrollPane scrollPane = new JScrollPane(table); private TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<DefaultTableModel>(myModel); private JButton button; private JButton button2; private JTextField filterText; RowFilter<DefaultTableModel, Integer> GreaterThan = new RowFilter<DefaultTableModel, Integer>() { public boolean include(Entry<? extends DefaultTableModel, ? extends Integer> entry) { myModel = entry.getModel(); //0 is the first column if ((int) table.getValueAt(entry.getIdentifier(), 0) > Integer.parseInt(filterText.getText())) { return true; } return false; } }; RowFilter<DefaultTableModel, Integer> LessThan = new RowFilter<DefaultTableModel, Integer>() { public boolean include(Entry<? extends DefaultTableModel, ? extends Integer> entry) { myModel = entry.getModel(); //0 is the first column if ((int) table.getValueAt(entry.getIdentifier(), 0) < Integer.parseInt(filterText.getText())) { return true; } return false; } }; public example() { filterText = new JTextField(); button = new JButton("Click to sort Greater Than"); button2 = new JButton("Click to sort Less Than"); add(button); add(button2); add(scrollPane); table.setRowSorter(sorter); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { sorter.setRowFilter(GreaterThan); } }); button2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { sorter.setRowFilter(LessThan); } }); } } 中短语Sortes\index[persons]{Sortes}的存在。

使用python test Sortes\index[persons]{Sortes} text我可以这样做:

re

这样做有效,但我想避免搜索模式>>> search = re.escape('Sortes\index[persons]{Sortes}') >>> match = 'test Sortes\index[persons]{Sortes} text' >>> re.search(search, match) <_sre.SRE_Match object; span=(5, 34), match='Sortes\\index[persons]{Sortes}'> 对短语Sortes给出肯定的结果。

test Sortes\index[persons]{Sortes} text

所以我使用>>> re.search(re.escape('Sortes'), match) <_sre.SRE_Match object; span=(5, 11), match='Sortes'> 模式,如下所示:

\b

现在,我没有得到匹配。

如果搜索模式不包含任何字符search = r'\b' + re.escape('Sortes\index[persons]{Sortes}') + r'\b' match = 'test Sortes\index[persons]{Sortes} text' re.search(search, match) ,则可以使用。 E.g:

[]{}

此外,如果我删除最终的>>> re.search(r'\b' + re.escape('Sortes\index') + r'\b', 'test Sortes\index test') <_sre.SRE_Match object; span=(5, 17), match='Sortes\\index'> ,它也可以:

r'\b'

此外,documentation说的是re.search(r'\b' + re.escape('Sortes\index[persons]{Sortes}'), 'test Sortes\index[persons]{Sortes} test') <_sre.SRE_Match object; span=(5, 34), match='Sortes\\index[persons]{Sortes}'>

  

注意,正式地,\ b被定义为\ w和\ W字符之间的边界(反之亦然),或者在\ w和字符串的开头/结尾之间。

所以我尝试用\b替换最终的\b

(\W|$)

瞧,它有效! 这里发生了什么?我错过了什么?

2 个答案:

答案 0 :(得分:3)

查看单词边界匹配的内容:

字边界可以出现在以下三个位置之一:

  
      
  • 在字符串中的第一个字符之前,如果第一个字符是单词字符。
  •   
  • 在字符串中的最后一个字符之后,如果最后一个字符是单词字符。
  •   
  • 字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。
  •   

在您的模式中}\b仅匹配}后面的单词char(字母,数字或_)。

当您使用(\W|$)时,您需要明确字符串的非单词或结尾。

在这些情况下,我总是建议基于负面外观的明确的单词边界:

re.search(r'(?<!\w){}(?!\w)'.format(re.escape('Sortes\index[persons]{Sortes}')), 'test Sortes\index[persons]{Sortes} test')

此处,如果当前位置左侧有一个单词char,则(?<!\w)负反馈将使匹配失败,如果立即有单词char,则(?!\w)否定前瞻将使匹配失败在当前位置的右侧。

实际上,可以更容易地进一步自定义这些外观模式(例如,如果模式周围有字母,则只能使匹配失败,请使用[^\W\d_]代替\w ,或者如果您只允许在空格周围进行匹配,请使用(?<!\S) / (?!\S)环视边界)。

答案 1 :(得分:0)

我认为这是你遇到的:

\b落在\w\W的边界上,但是在不起作用的示例中。 '{Sortes}\b'\W\W之间的边界,因为'}'[a-zA-Z0-9_]不匹配,\w的普通集合}。