Иногда с помощью персонажей, которые вы указали, возможно простое экранирование. Например, использование обратной косой черты для выхода из скобки не будет работать в левой части строки подстановки в sed, а именно
sed -e 's/foo\(bar/something_else/'
. Я просто использую простое определение класса символов вместо , поэтому вышеприведенное выражение становится
sed -e 's/foo[(]bar/something_else/'
, которое я нахожу для большинства реализаций регекса.
BTW Классы символов являются довольно ванильными элементами регулярного выражения, поэтому они, как правило, работают в большинстве ситуаций, когда вы нужны экранированные символы в регулярных выражениях.
Изменить: после комментария ниже, просто подумал, что я бы упомянул о том, что вам также нужно учитывать разницу между автоматами конечного состояния и автоматами не конечного состояния при просмотре поведение оценки regexp.
Возможно, вам захочется взглянуть на «блестящую книгу с шаром», а также на эффективную Perl ( санированную ссылку Amazon ), в частности главу о регулярных выражениях, чтобы получить почувствуйте тогда разницу в типах оценки двигателя regexp.
Не все в мире PCRE!
В любом случае, регулярные выражения настолько неуклюжи по сравнению с SNOBOL ! Теперь это был интересный курс программирования! Наряду с тем, что на Simula .
Ах, радости изучения в UNSW в конце 70-х! (-:
Вы должны установить QFormLayout в макете tab1, чтобы исключить следующее:
self.p1_vertical.addLayout(form)
и добавляет:
self.vbox.addLayout(form)
Хотя для лучшей организации я предпочитаю создавать новые классы:
from __future__ import division, print_function
import sys
from PyQt4 import QtGui, QtCore
class DataSelectionWidget(QtGui.QWidget):
def __init__(self, parent=None):
super(DataSelectionWidget, self).__init__(parent)
self.btn_cat = QtGui.QPushButton("Select category")
self.btn_cat.clicked.connect(self.getcat)
self.le3 = QtGui.QLineEdit(readOnly=True)
flay = QtGui.QFormLayout(self)
flay.addRow(self.btn_cat, self.le3)
# selected dir label
self.lbl_dir = QtGui.QLabel('Data directory not selected')
flay.addRow(self.lbl_dir)
# button label for datadir
btn_dir = QtGui.QPushButton('Browse...', self)
flay.addRow(btn_dir)
btn_dir.clicked.connect(self.get_dirname)
@QtCore.pyqtSlot()
def getcat(self):
cats = ['option 1', 'option 2']
category, ok = QtGui.QInputDialog.getItem(self, "select category",
"Option", cats, 0, False)
if ok:
self.le3.setText(category)
self.category = category
@QtCore.pyqtSlot()
def get_dirname(self):
print('yes')
class ToolsWidget(QtGui.QWidget):
def __init__(self, parent=None):
super(ToolsWidget, self).__init__(parent)
lay = QtGui.QVBoxLayout(self)
self.lblrun = QtGui.QLabel('Run')
lay.addWidget(self.lblrun)
# button for run
btn_run = QtGui.QPushButton('Run', self)
lay.addWidget(btn_run)
btn_run.clicked.connect(self.run)
@QtCore.pyqtSlot()
def run(self):
print('yes')
class Tester(QtGui.QWidget):
def __init__(self, parent=None):
# create GUI
super(Tester, self).__init__(parent)
self.setWindowTitle('Data tool')
# window dimensions
self.resize(300, 75)
tab1 = DataSelectionWidget()
tab2 = ToolsWidget()
# tabbing on
tab_widget = QtGui.QTabWidget()
tab_widget.addTab(tab1, "Data selection")
tab_widget.addTab(tab2, "Tools")
lay = QtGui.QVBoxLayout(self)
lay.addWidget(tab_widgetn)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
gui = Tester()
gui.show()
sys.exit(app.exec_())