0

重複の可能性:
Pythonでのみ引用符で囲まれていない単語を置き換える

これは私が今持っているものです

found = re.match( r"hello[(](.*)[)]", word, re.M|re.I)

それは見つけるでしょう:

Hello(here)  and give you "here"

次のことができるようにしたいと思います。

Hello  (Hi)     

両側に空白がある場合でも値を返します(ただし、空白のみで、他の文字は返しません)。したがって、これは「Hi」を返します。

'dfsfds Hello (Hi) fdfd' Hello (Yes)     

最初の部分は一重引用符で囲まれているため、これは「はい」を返します。したがって、これは使用しません(可能な場合は、空白の規則が引き続き適用されます)。

編集:

 Hello  ('Hi')  would return 'Hi'   
4

2 に答える 2

1

完璧ではないかもしれませんが、これはあなたのユースケースを満たしているようです. これは非常に複雑なプロセスだと思います。さらにいくつかのルールを追加することで、正規表現が本当に苦手とするタイプの問題に取り組み始めることができます。

>>> import re
>>> match_dict = {'hello(here)': 'here',
...                 'Hello   (Hi)': 'Hi',
...                 "'dfsfds Hello (Hi) fdfd' Hello (Yes)": 'Yes',
...                 "Hello ('hi)xx')": "hi)xx",
...                 "Hello  ('Hi')": 'Hi'}
>>> for s, goal in match_dict.iteritems():
...     print "INPUT: %s" % s
...     print "GOAL: %s" % goal
...     m = re.sub(r"(?<!\()'[^']+'", '', s, flags=re.I|re.M)
...     paren_quotes = re.findall(r"hello\s*\('([^']+)'\)", m, flags=re.I|re.M)
...     output = paren_quotes if paren_quotes else []
...     m = re.sub(r"hello\s*\('[^']+'\)", '', m, flags=re.I|re.M)
...     paren_matches = re.findall(r"hello\s*\(([^)]+)\)", m, flags=re.I|re.M)
...     if paren_matches:
...         output.extend(paren_matches)
...     print 'OUTPUT: %s\n' % output
... 
INPUT: 'dfsfds Hello (Hi) fdfd' Hello (Yes)
GOAL: Yes
OUTPUT: ['Yes']

INPUT: Hello  ('Hi')
GOAL: Hi
OUTPUT: ['Hi']

INPUT: hello(here)
GOAL: here
OUTPUT: ['here']

INPUT: Hello   (Hi)
GOAL: Hi
OUTPUT: ['Hi']

INPUT: Hello ('hi)xx')
GOAL: hi)xx
OUTPUT: ['hi)xx']
于 2012-05-18T13:20:26.513 に答える
0

最初に一重引用符内のすべてを削除するだけです。

>>> import re
>>> s = "'dfsfds Hello (Hi) fdfd' Hello (Yes)"
>>> s2 = re.sub(r"'[^']+'", '', s)
>>> re.search(r'hello\s*\(([^)]+)\)', s2, re.I|re.M).group(1)
'Yes'
于 2012-05-18T10:59:05.133 に答える