메타문자인 대괄호 사이에는 어떤 문자도 들어갈 수 있다. 문자 클래스로 만들어진 정규식은 대괄호 사이의 문자들과 매치 라는 의미를 가진다.
ex) ab, abb, abbb, abbbb, abbbbb
a로 시작하고 b가 여러 개 있는 문자열이다. 하지만 이 문장은 사람이 보면 알 수 있지만, 컴퓨터는 이 문장을 파악할 수 없다. 때문에 정규표현식이라는 약속된 방법으로 알려주면 컴퓨터가 파악해낼 수 있다. 다음과 같은 문장을 ab+ 라고 알려주면 된다.
ex) 오늘 달러원 환율은 1023원이고 어제 달러원 환율은 1180원이다. 그리고 너는 3살이고 걔는 92kg 이다.
이 문자열에 포함된 10진수 숫자만 뽑아서 특정한 변수에 담아오고 싶다. 그럴 때, find("10진수 숫자",str) 같은 형태의 함수가 있었으면 좋겠다.
정규표현식으로 모든 10진수 숫자는
[0-9] - 모든 10진수 숫자
[a-zA-Z] - 모든 알바벳 문자열
[a-c] - a,b,c
[1-4] - 1,2,3,4
[가-힣]+ - 모든 한글 문자
이다.
따라서 우리는
p = re.compile("[0-9]+")
str = "오늘 달러원 환율은 1023원이고 어제 달러원 환율은 1180원이다. 그리고 너는 3살이고 걔는 92kg 이다."
m = p.findall(str) # m = re.compile("[0-9]+").findall(str)
print(m)
re 라이브러리에서 findall이라는 함수는 지정된 문자열에서, 특정한 속성을 가진 것을 모두 찾아서 list 형태로 리턴해주는 함수다. 이 때, 특정한 속성을 나타내는 방식을 정규표현식이라고 부른다.
+가 붙을 경우 10진수 여러개가 연달아서 반복해서 나오는 문자열을 의미하고 +가 없을 경우 10진수 아무거나 한개 씩을 말하는 것이다.
정규표현식에서 사용하는 기호가 많은데, 이런 기호들을 정규표현식에서는 메타문자라고 부른다.
. ^ $ * + ? { } [ ] \ | ( )
라면 이 표현식의 의미는 a,b,c 중 한 개의 문자와 매치를 의미한다. a와 before, dude가 있을 때, a는 a가 있으므로 매치되고 before는 b가 있으므로 매치되고 dude는 이 중 어느 하나도 포함하고 있지 않기 때문에 매치되지 않는다.
대괄호 사이에 하이픈을 사용하면 두 문자 사이의 범위를 의미한다.
[abc]
정규 표현식의 .문자는 줄바꿈 문자인 \n을 제외한 모든 문자와 매치됨을 의미한다.
예를 들어 a.b는 a랑 b 사이 아무거나 다 들어간 케이스를 의미한다.
만약 진짜 a.b를 찾고 싶다면
a[.]b
라고 찾으면 된다.
re.sub(pattern, new, string)
string에서 pattern에 해당하는 부분을 new로 대체하라
QLineEdit: 마우스를 클릭하면 키보드로 데이터를 입력할 수 있는 창
self.textedit1 = QLineEdit(self)
self.textedit1.setValidator(QIntValidator(self)) # 정수만 입력된다.
self.textedit1.setValidator(QIntValidator(1,100,self)) # 1 ~ 100 사이의 정수 입력
다음과 같은 식을 정규표현식으로 제한할 수 있다.
self.textedit = QLineEdit()
re = QtCore.QRegExp("[0-9a-fA-F]*")
self.textedit.setValidator(QtGui.QRegExpValidator(re))
위 예시의 경우,
0~9까지의 숫자 & 소문자 a ~ f & 대문자 A ~ F 알파벳만 키보드 입력이 가능하다.
출처: https://newbie-developer.tistory.com/m/102, https://newbie-developer.tistory.com/m/103, https://newbie-developer.tistory.com/m/149